相关的介绍参考自: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简介
官方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位按逗号分隔
来源:https://www.cnblogs.com/jiangbei/p/7306849.html