四、poi.jar生成excle、sheet.getLastRowNum()统计sheet行数不准确问题修改

时间:2020-12-07 20:20:17

1、本章介绍使用poi.jar生成excel
由于在https://www.cnblogs.com/jiarui-zjb/p/7580440.html 该章节中对poi.jar做了相介绍,本章不再赘述,网上博友们写过有很多的demo,我只是想复习一下知识点,直接上代码了。
简单示列1:创建excle

四、poi.jar生成excle、sheet.getLastRowNum()统计sheet行数不准确问题修改四、poi.jar生成excle、sheet.getLastRowNum()统计sheet行数不准确问题修改
 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 }
View Code

简单示列2:读取示列1中生成的样板,进行创建excle

四、poi.jar生成excle、sheet.getLastRowNum()统计sheet行数不准确问题修改四、poi.jar生成excle、sheet.getLastRowNum()统计sheet行数不准确问题修改
  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 }
View Code

2、poi通过sheet.getLastRowNum() 获取当前sheet页行数时会将行内容为空,但是存在样式的行进行统计,导致获取的最大行数不准确
可通过将空白行(内容为空,但是存在样式)进行删除后再调用getLastRowNum()进行行数统计

四、poi.jar生成excle、sheet.getLastRowNum()统计sheet行数不准确问题修改四、poi.jar生成excle、sheet.getLastRowNum()统计sheet行数不准确问题修改
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;
}
View Code