相关的介绍参考自:http://zc985552943.iteye.com/blog/1491546

一、概述

  1.概念

  受上文博文博主的启发,有必要先对excel的各个概念先做了解!

//上述基本都是接口

//一个excel表格
HSSFWorkbook wb = new HSSFWorkbook();
//一个工作表格(sheet)
HSSFSheet sheet = wb.createSheet("sheet1");
//一行(row)
HSSFRow row = sheet.createRow(0);
//一个单元格(cell)
HSSFCell cell = row.createCell(0);
//单元格样式(cellStyle)
HSSFCellStyle cellStyle = wb.createCellStyle();
//单元格内容样式(dataFormat)
HSSFDataFormat format = wb.createDataFormat();

  2.POI简介

      官网:http://poi.apache.org/

    官方API:http://poi.apache.org/apidocs/index.html

    (韩国的JExcel这里暂不介绍)

    是什么?(引用官网介绍)

    

    能干什么?

    这里我们介绍导出excel的功能操作

   怎么干?

    我们这里先介绍HSSF的使用。

    这里最主要的熟悉里面那一套接口

  需要环境:这里使用POI3.9的版本(这个版本更新比较快)

<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>

  推荐版本单独管理的maven依赖写法:

<poi.version>3.9</poi.version>

 二、基本使用(HelloWorld)

  1.创建工作簿

 public static void main(String[] args) throws IOException {
//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//使用工作簿的write()方法向文件输出工作簿
FileOutputStream out = new FileOutputStream("E:\\1.xls");
wb.write(out);
//流的关闭
out.close();
}

  

  2.创建sheet页

 public static void main(String[] args) throws IOException {
//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//创建两个sheet页
wb.createSheet("sheet1");
wb.createSheet("sheet2");
//创建流并将wb输出
FileOutputStream out = new FileOutputStream("E:\\2.xls");
wb.write(out);
//流的关闭
out.close();
}

  3.创建行和单元格

  excel中行的概念:(单元格即为行的每一个元素)

  

public static void main(String[] args) throws IOException {
//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//创建sheet页(使用的是带参构造器)
Sheet sheet = wb.createSheet("sheet01");
//创建行(从0开始)
Row row = sheet.createRow(0);
//创建单元格(第一列)
Cell cell = row.createCell(0);
//给单元格赋值
cell.setCellValue("测试单元格内容");
//创建流并将wb输出
FileOutputStream out = new FileOutputStream("E:\\3.xls");
wb.write(out);
//流的关闭
out.close();
}

  

  单元格创建其他值的示例

 public static void main(String[] args) throws IOException {
//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//创建sheet页(使用的是带参构造器)
Sheet sheet = wb.createSheet("sheet01");
//创建行(从0开始)
Row row = sheet.createRow(0);
//创建单元格(第一列)
Cell cell = row.createCell(0);
//给单元格赋值
cell.setCellValue("测试单元格内容");
//测试其他的赋值方式
row.createCell(1).setCellValue(1.1); //第二列赋浮点值
row.createCell(2).setCellValue(false); //第三列赋值boolean型
//创建流并将wb输出
FileOutputStream out = new FileOutputStream("E:\\4.xls");
wb.write(out);
//流的关闭
out.close();
}

三、单元格数据格式

  1.时间样式单元格

 public static void main(String[] args) throws IOException {
//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//创建sheet页(使用的是带参构造器)
Sheet sheet = wb.createSheet("sheet01");
//创建行(从0开始)
Row row = sheet.createRow(0);
//创建单元格(第一列)
Cell cell = row.createCell(0);
//给单元格赋值
cell.setCellValue(new Date());
//创建流并将wb输出
FileOutputStream out = new FileOutputStream("E:\\1.xls");
wb.write(out);
//流的关闭
out.close();
}

  效果:

  //可以看到,是一个长整形

 调整为时间样式:

 public static void main(String[] args) throws IOException {
//创建工作簿 (使用了多态特性) HSSFWorkbook wb = new HSSFWorkbook();
Workbook wb = new HSSFWorkbook();
//创建sheet页(使用的是带参构造器)
Sheet sheet = wb.createSheet("sheet01");
//创建行(从0开始)
Row row = sheet.createRow(0);
//创建单元格(第一列)
Cell cell = row.createCell(0);
//给单元格赋值
cell.setCellValue(new Date());
/*
* ==========时间样式单元格==============
*/
// CreationHelper 可以理解为一个工具类,由这个工具类可以获得 日期格式化的一个实例
CreationHelper creationHelper = wb.getCreationHelper();
//创建单元格样式类
CellStyle cellStyle = wb.createCellStyle();
//设置时间样式
cellStyle.setDataFormat(creationHelper.createDataFormat().getFormat("yyyy-MM-dd HH:mm:ss"));
//给第一行第二列赋值
Cell cell2 = row.createCell(1);
cell2.setCellValue(new Date());
cell2.setCellStyle(cellStyle);
//创建流并将wb输出
FileOutputStream out = new FileOutputStream("E:\\2.xls");
wb.write(out);
//流的关闭
out.close();
}

  

  2.处理不同类型内容:

public static void main(String[] args) throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("三年级(1)班学生名单");
Row row = sheet1.createRow(0);
row.createCell(0).setCellValue(1);
row.createCell(1).setCellValue("一个字符串");
row.createCell(2).setCellValue(true);
row.createCell(3).setCellValue(HSSFCell.CELL_TYPE_NUMERIC);
row.createCell(4).setCellValue(false);
FileOutputStream fos = new FileOutputStream(
"c:\\POI使用FileOutputStream输出流生成的工作簿.xls");
wb.write(fos);
fos.close();
// wb 是需要关闭的,否则编译器会有提示
wb.close();
}

//突如其来的断点防不胜防,这里这个示例是借的网友的

  3.遍历内容

public static void main(String[] args) throws IOException {
//通过输入流获取工作簿
InputStream in = new FileInputStream("E:\\1.xls");
//(以下直接使用的是类而不是接口,因为类有实现还有自己的方法,更加强大)
POIFSFileSystem fs = new POIFSFileSystem(in);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet hssfSheet = wb.getSheetAt(0); //获取第一个sheet页 if(hssfSheet == null){ //sheet页不存在,不做处理
return;
}
//遍历行
for(int rowNum = 0; rowNum <= hssfSheet.getLastRowNum(); rowNum++){
HSSFRow hssfRow = hssfSheet.getRow(rowNum);
if(hssfRow == null){ //空处理
continue;
}
//遍历列
for(int cellNum = 0; cellNum <= hssfRow.getLastCellNum(); cellNum++){
HSSFCell hssfCell = hssfRow.getCell(cellNum);
if(hssfCell == null){ //空处理
continue;
}
System.out.print(getCellValue(hssfCell)+" ");
}
System.out.println();
}
} /**
* 封装的类型转换处理静态方法
*/
private static String getCellValue(HSSFCell hssfCell){
if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN){
return String.valueOf(hssfCell.getBooleanCellValue());
} else if(hssfCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC){
return String.valueOf(hssfCell.getNumericCellValue());
} else{
return String.valueOf(hssfCell.getStringCellValue());
}
}

 网友的switch版本:

  private static String getCellDate(Cell cell) {
String return_string = null;
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
return_string = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
return_string = cell.getNumericCellValue() + "";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
return_string = String.valueOf(cell.getBooleanCellValue());
default:
return_string = "";
break;
}
return return_string;
}

   

  

  //时间样式遍历待更新

  4.文本提取

public static void main(String[] args) throws IOException {
//通过输入流获取工作簿
InputStream in = new FileInputStream("E:\\1.xls");
//(以下直接使用的是类而不是接口,因为类有实现还有自己的方法,更加强大)
POIFSFileSystem fs = new POIFSFileSystem(in);
HSSFWorkbook wb = new HSSFWorkbook(fs); ExcelExtractor excelExtractor = new ExcelExtractor(wb);
//抽取文本输出
System.out.println(excelExtractor.getText());
     in.close();
}

//这里使用的是实现类,导包如下:

import org.apache.poi.hssf.extractor.ExcelExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

  

  //可以去掉sheet页名字

     ExcelExtractor excelExtractor = new ExcelExtractor(wb);
excelExtractor.setIncludeSheetNames(false);
//抽取文本输出
System.out.println(excelExtractor.getText());

 四、单元格设置对齐、边框、合并等样式

  1.单元格对齐方式

 public static void main(String[] args) throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
Row row = sheet1.createRow(2); //创建第3行
row.setHeightInPoints(30); //设置行高(可参见API等 )
//调用封装的方法,创建单元格 (样式均是常量)
Cell cell1 = createCell(wb, row, (short)0, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_BOTTOM); //使用short足够
cell1.setCellValue("操作Excel");
Cell cell2= createCell(wb, row, (short)1, HSSFCellStyle.ALIGN_CENTER, HSSFCellStyle.VERTICAL_TOP); //使用short足够
cell2.setCellValue("操作Excel");
FileOutputStream fos = new FileOutputStream("E:\\5.xls");
wb.write(fos);
fos.close();
}

  封装的私有方法:(请重视封装

 private static Cell createCell(Workbook wb,Row row,short column,short hailgn,short valign){
Cell cell = row.createCell(column); //创建单元格
cell.setCellValue(new HSSFRichTextString("富文本区域")); //字符串可以使用此方式
//创建并设置样式
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(hailgn); //水平方向
cellStyle.setVerticalAlignment(valign); //垂直方向
//设置单元格样式
cell.setCellStyle(cellStyle);
return cell;
}

  效果:

  其他样式请自行探索或根据文首文档查看。

  2.边框处理

public static void main(String[] args) throws IOException {
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1");
Row row = sheet1.createRow(1); //创建第2行 Cell cell = row.createCell(1); //创建第二列
cell.setCellValue("666");
//单元格样式
CellStyle cellStyle = wb.createCellStyle();
//同样,通过常量进行设置
cellStyle.setBorderBottom(CellStyle.BORDER_THIN); //底部边框样式
//通过颜色索引设置底部颜色
cellStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex()); //底部边框颜色 //同理,设置左边样式
cellStyle.setBorderLeft(CellStyle.BORDER_THICK); //左边边框样式
cellStyle.setLeftBorderColor(IndexedColors.BLUE.getIndex()); //左边边框颜色 //同理,设置右边样式
cellStyle.setBorderRight(CellStyle.BORDER_DASHED);
cellStyle.setRightBorderColor(IndexedColors.GREEN.getIndex());
//最后,设置顶部样式
cellStyle.setBorderTop(CellStyle.BORDER_THIN);
cellStyle.setTopBorderColor(IndexedColors.BROWN.getIndex()); //注入样式
cell.setCellStyle(cellStyle);
FileOutputStream fos = new FileOutputStream("E:\\6.xls");
wb.write(fos);
fos.close();
}

  效果:

  3.单元格填充色和颜色操作

public static void main(String[] args) throws IOException {
//创建工作簿和sheet页
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1"); Row row = sheet1.createRow(1); //创建第2行
Cell cell = row.createCell(1); //创建第2列
cell.setCellValue("777"); CellStyle cellStyle = wb.createCellStyle();
cellStyle.setFillBackgroundColor(IndexedColors.GREEN.getIndex()); //背景色
cellStyle.setFillPattern(CellStyle.BIG_SPOTS); //带点的效果 //注入样式
cell.setCellStyle(cellStyle); Cell cell2 = row.createCell(2); //创建第2列
cell2.setCellValue("777"); CellStyle cellStyle2 = wb.createCellStyle();
cellStyle2.setFillForegroundColor(IndexedColors.BLUE.getIndex()); //前景色
cellStyle2.setFillPattern(CellStyle.SOLID_FOREGROUND);
//注入样式
cell2.setCellStyle(cellStyle2);
FileOutputStream fos = new FileOutputStream("E:\\7.xls");
wb.write(fos);
fos.close();
}

  单元格颜色样式背景色未正确显示,待更新:

  4.单元格合并

 public static void main(String[] args) throws IOException {
//创建工作簿和sheet页
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1"); Row row = sheet1.createRow(1); //创建第2行
Cell cell = row.createCell(1); //创建第2列
cell.setCellValue("单元格合并测试"); //单元格合并是由sheet来控制的,cell是无法控制合并的(只能管自己的样式)
//四个参数:起始结束行;起始结束列(注意都是从0开始)
sheet1.addMergedRegion(new CellRangeAddress(1, 1, 1, 2)); FileOutputStream fos = new FileOutputStream("E:\\8.xls");
wb.write(fos);
fos.close();
}

  效果:

  进一步测试合并4个单元格

sheet1.addMergedRegion(new CellRangeAddress(1, 2, 1, 2));

  效果:

 五、操作excel的其他处理

  1.字体处理

 public static void main(String[] args) throws IOException {
//创建工作簿和sheet页
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1"); Row row = sheet1.createRow((short)1); //创建第2行 //创建字体处理类
Font font = wb.createFont();
//设置字体相关样式
font.setFontHeightInPoints((short)24); //设置高度
font.setFontName("Courier New"); //设置字体名字(官方demo的宽体字体)
font.setItalic(true); //设置是否斜体
font.setStrikeout(true); //一种中间带线的样式(类似删除线),见效果 //创建cellStyle,font是style中的一个样式
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setFont(font); Cell cell = row.createCell((short)1);
cell.setCellValue("单元格字体测试"); //注入样式
cell.setCellStyle(cellStyle);
FileOutputStream fos = new FileOutputStream("E:\\1.xls");
wb.write(fos);
fos.close();
}

  2.读取和重写工作簿

 public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream("E:\\1.xls");
//通过输入流,得到工作簿
POIFSFileSystem fs = new POIFSFileSystem(in);
Workbook wb = new HSSFWorkbook(fs);
//通过下标获取sheet页
Sheet sheet1 = wb.getSheetAt(0); Row row = sheet1.getRow(1); //获取第一行
Cell cell = row.getCell(0); //获取第一个单元格
if(cell == null){ //为 Null则新建一个
cell = row.createCell(3);
}
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue("测试读取重写");
FileOutputStream fos = new FileOutputStream("E:\\1.xls");
//重新写回原处
wb.write(fos);
fos.close();
}

  //如报错,应该是excel文件被占用,退出文件占用即可

  效果:

  3.单元格使用换行

  如何在excel中换行呢?——使用 alt+enter

  

 public static void main(String[] args) throws IOException {
//创建sheet页
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1"); //创建单元格
Row row = sheet1.createRow(1);
Cell cell = row.createCell(1); cell.setCellValue("即将换行 \n 换行成功"); //通过样式设置允许换行
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setWrapText(true); //允许换行 cell.setCellStyle(cellStyle); //调整行高(2倍默认行高)
row.setHeightInPoints(2*sheet1.getDefaultRowHeightInPoints());
//调整宽度,详见API
sheet1.autoSizeColumn(2); FileOutputStream fos = new FileOutputStream("E:\\2.xls");
wb.write(fos);
fos.close();
}

  效果:

  4.创建用户自定义数据格式

public static void main(String[] args) throws IOException {
//创建sheet页
Workbook wb = new HSSFWorkbook();
Sheet sheet1 = wb.createSheet("sheet1"); //数据格式属于style里的,类似字体
DataFormat format = wb.createDataFormat(); //定义
CellStyle cellStyle;
Row row;
Cell cell;
short rowNum = 0;
short cellNum = 0; //创建
row = sheet1.createRow(rowNum++);
cell = row.createCell(cellNum++); cell.setCellValue(10086.258); cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(format.getFormat("0.0")); //设置数据格式 //注入样式
cell.setCellStyle(cellStyle);
//========================= row = sheet1.createRow(rowNum++);
cell = row.createCell(cellNum++); cell.setCellValue(3456789.258); cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(format.getFormat("#,##0.000")); //设置数据格式
//注入样式
cell.setCellStyle(cellStyle); FileOutputStream fos = new FileOutputStream("E:\\3.xls");
wb.write(fos);
fos.close();
}

  //定义与创建分离的写法(推荐)

  效果:

  其中,0.0为保留一位小数,自动四舍五入了

  第二个为3位3位按逗号分隔

Java使用POI导出excel(上)——基本操作的更多相关文章

  1. Java之POI导出Excel(一):单sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码  <!-- ...

  2. java解决poi导出excel文字水印,导出excel不可操作问题

    首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...

  3. java使用poi导出excel

    继上一篇导出pdf,这篇导出excel. 1.导入依赖 <dependency> <groupId>org.apache.poi</groupId> <art ...

  4. Java使用POI导出excel(下)——实例与小技巧

    [更新]:thinkgem的导出工具类: /** * Copyright © 2012-2016 <a href="https://github.com/thinkgem/jeesit ...

  5. java springmvc poi 导出Excel,先简单记录,后期会详细描写

    POI jar包下载 : http://poi.apache.org/download.html jsp代码 <%@ page language="java" content ...

  6. Java之POI导出Excel(二):多个sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,之前我也写过一篇导出单个sheet工作表的文章,没看过的小伙伴可以去看哈,链接也给大家放出来了:导出单个sheet 但是在我们日常的工作中,需 ...

  7. Java之Poi导出Excel文档

    一.Poi简介 在后台管理系统中,我们经常要做的导出操作,通常导出为Excel文档的形式,而Poi则提供了这种需要的支持. 二.Workbook/HSSFWorkbook/XSSFWorkbook 1 ...

  8. java用POI导出Excel

    架构SSM + Maven 一.添加依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactI ...

  9. java 使用poi导出Excel,设置单元格保护不可编辑

    //sheet表加密:等效excel的审阅菜单下的保护工作表 sheet.protectSheet(new String("333"));//333是密码 更多设置请参考:http ...

随机推荐

  1. windows10 彻底卸载 Docker 和 DockerNAT

    删除docker程序 记事本新建脚本文件 a.ps1,内容如下: $ErrorActionPreference = "SilentlyContinue" kill -force - ...

  2. 51nod 1349 最大值

    题目看这里 找到每个元素g[i]作为最大值的区间[L,R],那么以他为最大值的区间数有(i-L+1)*(R-i+1)个. 为了加速,以k为最大值的区间数放入H[k],再以此统计一个前缀和,更新入H.那 ...

  3. 在Eclipse中通过build.xml导入工程

    http://www.zihou.me/html/2012/10/18/7868.html

  4. Swap是个什么东东?

    要明白这个首先要知道什么是保护模式和实模式.以前的操作系统是实模式,例如dos.每个时候只有一个进程在跑,这个进程使用全部的物理内存.后来发展到保护模式,分时多进程.一个CPU上跑多个进程, 但进程不 ...

  5. 4、集合set的功能介绍

    集合是易变(可改变)和无序聚集.集合set支持迭代,很像无值(或仅有键的)字典,用花括号表示{}.   1.集合的创建: 可以通过调用内建函数set()来创建,及向其传递一个迭代,该迭代的项目成为形成 ...

  6. Odoo中如何复制有唯一性约束的记录?

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9281393.html  如果为模型的字段添加了唯一性约束,那么在记录的form视图功能菜单上选择“复制”时就会 ...

  7. 数论——算数基本定理 - HDU 4497 GCD and LCM

    GCD and LCM Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others)Total ...

  8. 2、Web Service-术语

    1.Java中的Web Service规范 三种规范:JAXM&SAAJ.JAX-WS(JAX-RPC).JAX-RS. 三要素:soap,wsdl,uddi 1. Jaxws(掌握) JAX ...

  9. keras写模型时遇到的典型问题,也是最基础的类与对象问题

    自己定义了一个卷积类,现在需要把卷积加入model中,我的操作是这样的: model.add(Convolution1dLayer) 这样就会报错: 正确的写法是: model.add(Convolu ...

  10. Spring(四)之Bean生命周期、BeanPost处理

    一.Bean 生命周期 Spring bean的生命周期很容易理解.当bean被实例化时,可能需要执行一些初始化以使其进入可用状态.类似地,当不再需要bean并从容器中移除bean时,可能需要进行一些 ...