1、本章介绍使用poi.jar生成excel
由于在https://www.cnblogs.com/jiarui-zjb/p/7580440.html 该章节中对poi.jar做了相介绍,本章不再赘述,网上博友们写过有很多的demo,我只是想复习一下知识点,直接上代码了。
简单示列1:创建excle
1 import java.io.FileInputStream; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.List; 6 import org.apache.poi.hssf.usermodel.HSSFCell; 7 import org.apache.poi.hssf.usermodel.HSSFRow; 8 import org.apache.poi.hssf.usermodel.HSSFSheet; 9 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 10 import org.apache.poi.ss.usermodel.Cell; 11 import org.apache.poi.ss.usermodel.Row; 12 import org.apache.poi.ss.usermodel.Sheet; 13 import org.apache.poi.ss.util.CellRangeAddress; 14 import org.junit.Test; 15 /** 16 * 17 * @classDesc: 功能描述:使用poi工具包实现excle导出 18 * 1)在本地 D:\ceshiZJB\createExcle目录下 创建新文件:POIExcel文件示例.xls 19 * 2)实现标题行:合并单元格,行宽为40,列高为30 20 * @author: zjb 21 * @createTime: 创建时间:2018-8-3 下午6:49:18 22 * @version: v1.0 23 * @copyright:pactera 24 */ 25 public class PoiTest1_New { 26 public static void main(String[] args){ 27 PoiTest1_New poiTest=new PoiTest1_New(); 28 try { 29 poiTest.makeExcleByPOI(); 30 } catch (Exception e) { 31 e.printStackTrace(); 32 } 33 } 34 public void makeExcleByPOI() throws Exception { 35 // 1. 创建HSSFWorkbook对象(excel的文档对象) 36 HSSFWorkbook wb = new HSSFWorkbook(); 37 // 2. 建立新的sheet对象(excel的表单) 38 HSSFSheet sheet = wb.createSheet("成绩表"); 39 sheet.setDefaultRowHeightInPoints(30);// 设置缺省列高 40 sheet.setDefaultColumnWidth(40);// 设置缺省列宽 41 //3. 操作单元格 42 // 3.1 创建行对象,参数为行索引:可以是0~65535之间的任何一个 43 HSSFRow row1 = sheet.createRow(0); 44 // 3.2用行对象创建单元格对象,参数为列索引:可以是0~255之间的任何一个 45 HSSFCell cell = row1.createCell(0); 46 // 设置单元格内容 47 cell.setCellValue("学员考试成绩一览表"); 48 // 合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列 49 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3)); 50 // 在sheet里创建第二行 51 HSSFRow row2 = sheet.createRow(1); 52 // 创建单元格并设置单元格内容 53 row2.createCell(0).setCellValue("姓名"); 54 row2.createCell(1).setCellValue("班级"); 55 row2.createCell(2).setCellValue("笔试成绩"); 56 row2.createCell(3).setCellValue("机试成绩"); 57 // 在sheet里创建第三行 58 HSSFRow row3 = sheet.createRow(2); 59 row3.createCell(0).setCellValue("李明"); 60 row3.createCell(1).setCellValue("As178"); 61 row3.createCell(2).setCellValue(87); 62 row3.createCell(3).setCellValue(78); 63 HSSFRow row4 = sheet.createRow(3); 64 row4.createCell(0).setCellValue("庞少"); 65 row4.createCell(1).setCellValue("As179"); 66 row4.createCell(2).setCellValue(87); 67 row4.createCell(3).setCellValue(78); 68 // .....省略部分代码 69 // 输出Excel文件 70 FileOutputStream output = new FileOutputStream("D:\\ceshiZJB\\createExcle\\POIExcel文件示例.xls"); 71 wb.write(output); 72 output.flush(); 73 output.close(); 74 } 75 }
简单示列2:读取示列1中生成的样板,进行创建excle
1 import java.io.FileInputStream; 2 import java.io.FileOutputStream; 3 import java.io.IOException; 4 import java.util.ArrayList; 5 import java.util.List; 6 import org.apache.poi.hssf.usermodel.HSSFCell; 7 import org.apache.poi.hssf.usermodel.HSSFRow; 8 import org.apache.poi.hssf.usermodel.HSSFSheet; 9 import org.apache.poi.hssf.usermodel.HSSFWorkbook; 10 import org.apache.poi.ss.usermodel.Cell; 11 import org.apache.poi.ss.usermodel.Row; 12 import org.apache.poi.ss.usermodel.Sheet; 13 import org.apache.poi.ss.util.CellRangeAddress; 14 import org.junit.Test; 15 /** 16 * 17 * @classDesc: 功能描述:使用poi工具包实现excle导出 18 * 1)在本地 通过读取本地文件:POIExcel文件示例.xls,创建新的 POIExcel文件示例_new1.xls 19 * 2)读取第四行内容放入:temp这个数组中,并进行输出 20 * @author: zjb 21 * @createTime: 创建时间:2018-8-3 下午6:49:18 22 * @version: v1.0 23 * @copyright:pactera 24 */ 25 public class PoiTest2_modifySimple { 26 public static void main(String[] args){ 27 PoiTest2_modifySimple poiTest=new PoiTest2_modifySimple(); 28 try { 29 poiTest.loadScoreInfo(); 30 } catch (IOException e) { 31 e.printStackTrace(); 32 } 33 } 34 public void loadScoreInfo() throws IOException { 35 ArrayList temp = new ArrayList(); 36 FileInputStream fileIn = new FileInputStream("D:\\ceshiZJB\\createExcle\\POIExcel文件示例.xls"); 37 //输出模板 38 FileOutputStream out = new FileOutputStream("D:\\ceshiZJB\\createExcle\\POIExcel文件示例_new1.xls"); 39 //1. 根据指定的文件输入流导入Excel从而产生Workbook对象 40 HSSFWorkbook workBook = new HSSFWorkbook(fileIn); 41 //2. 获取Excel文档中的第一个表单 42 Sheet sht0 = workBook.getSheetAt(0); 43 // 对Sheet中的每一行进行迭代 44 for (Row r : sht0) { 45 System.out.println("Sheet是一个集合,集合中存放的是行对象,获取当前行对象-->"+r); 46 // 如果当前行的行号(从0开始)未达到3(第四行)则从新循环 47 System.out.println("r.getRowNum()--起始->"+r.getRowNum()); 48 if (r.getRowNum() < 3) { 49 continue; 50 } 51 System.out.println("r.getRowNum()--->"+r.getRowNum()); 52 // 创建实体类 53 ScoreInfo info = new ScoreInfo(); 54 // 取出当前行第1个单元格数据,并封装在info实体stuName属性上 55 System.out.println("r.getCell(0).getStringCellValue()-->"+r.getCell(0).getStringCellValue()); 56 info.setStuName(r.getCell(0).getStringCellValue()); 57 System.out.println("r.getCell(1).getStringCellValue()-->"+r.getCell(1).getStringCellValue()); 58 info.setClassName(r.getCell(1).getStringCellValue()); 59 System.out.println("r.getCell(2).getNumericCellValue()-->"+r.getCell(2).getNumericCellValue()); 60 info.setWrittenScores(r.getCell(2).getNumericCellValue()); 61 System.out.println("r.getCell(3).getNumericCellValue()-->"+r.getCell(3).getNumericCellValue()); 62 info.setMachineScores(r.getCell(3).getNumericCellValue()); 63 temp.add(info); 64 System.err.println("info--->"+info); 65 workBook.write(out); 66 out.flush(); 67 out.close(); 68 } 69 fileIn.close(); 70 } 71 } 72 /** 73 * 74 * @classDesc: 功能描述:实体类 75 * @author: zjb 76 * @createTime: 创建时间:2018-8-3 下午6:51:07 77 * @version: v1.0 78 * @copyright:pactera 79 */ 80 81 public class ScoreInfo { 82 private String StuName; 83 private String ClassName; 84 private double WrittenScores; 85 private double MachineScores; 86 87 public String getStuName() { 88 return StuName; 89 } 90 public void setStuName(String stuName) { 91 StuName = stuName; 92 } 93 public String getClassName() { 94 return ClassName; 95 } 96 public void setClassName(String className) { 97 ClassName = className; 98 } 99 public double getWrittenScores() { 100 return WrittenScores; 101 } 102 public void setWrittenScores(double writtenScores) { 103 WrittenScores = writtenScores; 104 } 105 public double getMachineScores() { 106 return MachineScores; 107 } 108 public void setMachineScores(double machineScores) { 109 MachineScores = machineScores; 110 } 111 @Override 112 public String toString() { 113 return "ScoreInfo [StuName=" + StuName + ", ClassName=" + ClassName 114 + ", WrittenScores=" + WrittenScores + ", MachineScores=" 115 + MachineScores + "]"; 116 } 117 }
2、poi通过sheet.getLastRowNum() 获取当前sheet页行数时会将行内容为空,但是存在样式的行进行统计,导致获取的最大行数不准确
可通过将空白行(内容为空,但是存在样式)进行删除后再调用getLastRowNum()进行行数统计
sheet0=getAccuracyContextNum(book); int allRownum=sheet0.getLastRowNum(); //获取准确的文件行数 public Sheet getAccuracyContextNum(Workbook workbook) { // 取第一个sheet Sheet sheet = workbook.getSheetAt(0); // 删除空行 for (int i = 0; i <= sheet.getLastRowNum(); i++) { Row row = sheet.getRow(i); // 删除空行 if (this.isRowEmpty(row)) { int lastRowNum = sheet.getLastRowNum(); if (i >= 0 && i < lastRowNum) { sheet.shiftRows(i + 1, lastRowNum, -1);// 将行号为i+1一直到行号为lastRowNum的单元格全部上移一行,以便删除i行 } if (i == lastRowNum) { if (row != null) { sheet.removeRow(row); } } i--; } } return sheet; }