文件导出笔记easyExecl和ApachePOI 07和03的区别

博客介绍了Apache POI操作Excel的相关知识。03版本对象是HSSFWorkbook,后缀为xls;07版本对象是XSSFWorkbook,后缀为xlsx。03版本行数有限,超出65536行写入会报错,且获取数值时要注意类型,还提及了不同版本的读取及计算公式。

Apache POI

在这里插入图片描述

03版本 对象是HSSFWorkbook 后缀xls

public void testWrite03() throws IOException {

 // 创建新的Excel 工作簿
 Workbook workbook = new HSSFWorkbook();

 // 在Excel工作簿中建一工作表,其名为缺省值 Sheet0
 //Sheet sheet = workbook.createSheet();

 // 如要新建一名为"会员登录统计"的工作表,其语句为:
 Sheet sheet = workbook.createSheet("狂神观众统计表");

 // 创建行(row 1)
 Row row1 = sheet.createRow(0);

 // 创建单元格(col 1-1)
 Cell cell11 = row1.createCell(0);
 cell11.setCellValue("今日新增关注");

 // 创建单元格(col 1-2)
 Cell cell12 = row1.createCell(1);
 cell12.setCellValue(999);

 // 创建行(row 2)
 Row row2 = sheet.createRow(1);

 // 创建单元格(col 2-1)
 Cell cell21 = row2.createCell(0);
 cell21.setCellValue("统计时间");

 //创建单元格(第三列)
 Cell cell22 = row2.createCell(1);
 String dateTime = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
 cell22.setCellValue(dateTime);

 // 新建一输出文件流(注意:要先创建文件夹)
 FileOutputStream out = new FileOutputStream(path+"狂神观众统计表03.xls");
 // 把相应的Excel 工作簿存盘
 workbook.write(out);
 // 操作结束,关闭文件
 out.close();

 System.out.println("文件生成成功");
}

07版本 对象是XSSFWorkbook 后缀是xlsx

public void testWrite07() throws IOException {

 // 创建新的Excel 工作簿
 Workbook workbook = new XSSFWorkbook();

 // 在Excel工作簿中建一工作表,其名为缺省值 Sheet0
 //Sheet sheet = workbook.createSheet();

 // 如要新建一名为"会员登录统计"的工作表,其语句为:
 Sheet sheet = workbook.createSheet("狂神观众统计表");

 // 创建行(row 1)
 Row row1 = sheet.createRow(0);

 // 创建单元格(col 1-1)
 Cell cell11 = row1.createCell(0);
 cell11.setCellValue("今日新增关注");

 // 创建单元格(col 1-2)
 Cell cell12 = row1.createCell(1);
 cell12.setCellValue(999);

 // 创建行(row 2)
 Row row2 = sheet.createRow(1);

 // 创建单元格(col 2-1)
 Cell cell21 = row2.createCell(0);
 cell21.setCellValue("统计时间");

 //创建单元格(第三列)
 Cell cell22 = row2.createCell(1);
 String dateTime = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
 cell22.setCellValue(dateTime);

 // 新建一输出文件流(注意:要先创建文件夹)
 FileOutputStream out = new FileOutputStream(path+"狂神观众统计表03.xlsx");
 // 把相应的Excel 工作簿存盘
 workbook.write(out);
 // 操作结束,关闭文件
 out.close();

 System.out.println("文件生成成功");
}

注意:03和07版本的后缀和对象不一样 行数:03有限07无限

03大量数据写入 如果超出65536 行数据就会报错如下

java.lang.IllegalArgumentException: Invalid row number (65536) outside allowable range (0…65535)

public void testWrite03BigData() throws IOException {
 //开始时间
 long begin = System.currentTimeMillis();
 //创建一个工作簿
 HSSFWorkbook workbook = new HSSFWorkbook();
 //创建一个表
 HSSFSheet sheet = workbook.createSheet();
 //写入数据
 for (int rowNum = 0; rowNum < 65536; rowNum++) {
     //创建行
     HSSFRow row = sheet.createRow(rowNum);
     //创建列
     for (int cellNum = 0; cellNum < 10; cellNum++) {
         HSSFCell cell = row.createCell(cellNum);
         cell.setCellValue(cellNum);
     }
 }
 FileOutputStream fileOutputStream =
         new FileOutputStream(path + "03.xls");
 workbook.write(fileOutputStream);
 //结束时间
 long end = System.currentTimeMillis();

 System.out.println("03.xls | 生成成功!"+(double)(end-begin)/1000);
}

获取数值的时候一定要注意类型

excel 读 03版

//03读取
@Test
public void testRead03() throws Exception {

 //获取文件流
 FileInputStream fileInputStream = new FileInputStream(path + "测试表.xls");
 //创建一个工作簿
 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fileInputStream);
 //得到表
 HSSFSheet sheet = hssfWorkbook.getSheetAt(0);
 //得到行
 HSSFRow row = sheet.getRow(0);
 //得到列
 HSSFCell cell = row.getCell(1);


 //读取值一定要注意类型
 //cell.getStringCellValue()  获取文本类型  字符串
 //System.out.println(cell.getStringCellValue());

 //获取数字类型
 System.out.println(cell.getNumericCellValue());
 fileInputStream.close();
}

excel 读 07版

//07读取
@Test
public void testRead07() throws Exception {

 //获取文件流
 FileInputStream fileInputStream = new FileInputStream(path + "狂神观众统计表03.xlsx");
 //创建一个工作簿
 Workbook fWorkbook = new XSSFWorkbook(fileInputStream);
 //得到表
 Sheet sheet = fWorkbook.getSheetAt(0);
 //得到行
 Row row = sheet.getRow(0);
 //得到列
 Cell cell = row.getCell(1);


 //读取值一定要注意类型
 //cell.getStringCellValue()  获取文本类型  字符串
 //System.out.println(cell.getStringCellValue());

 //获取数字类型
 System.out.println(cell.getNumericCellValue());
 fileInputStream.close();
}

读取不同的数据类型

public void testCellTyoe() throws IOException {
 //获取文件流
 FileInputStream fileInputStream = new FileInputStream(path + "会员消费商品明细表.xls");
 //创建一个工作簿
 HSSFWorkbook workbook = new HSSFWorkbook(fileInputStream);
 //获取表
 HSSFSheet sheet = workbook.getSheetAt(0);
 //获取标题内容
 HSSFRow rowTitle = sheet.getRow(0);
 if (rowTitle != null){
     //获取行中不为空的列
     int cellCount = rowTitle.getPhysicalNumberOfCells();
     for (int cellNum = 0; cellNum < cellCount; cellNum++) {
         HSSFCell cell = rowTitle.getCell(cellNum);
         if (cell != null){
             //获取类型
             int cellType = cell.getCellType();
             //获取列中的值
             String cellValue = cell.getStringCellValue();
             System.out.print(cellValue+ " | ");
             //System.out.print(cellType);
         }
     }
     System.out.println();
 }
 //获取表中内容
 //获取行的记录
 int rowCount = sheet.getPhysicalNumberOfRows();
 for (int rowNum = 1; rowNum < rowCount; rowNum++) {
     HSSFRow rowData = sheet.getRow(rowNum);
     if (rowData!=null){
         //读取列
         int cellCount = rowTitle.getPhysicalNumberOfCells();
         for (int cellNUm = 0; cellNUm < cellCount; cellNUm++) {
             System.out.print("["+(rowNum+1)+"-"+(cellNUm+1)+"]");

             HSSFCell cell = rowData.getCell(cellNUm);
             //匹配列的数据类型
             if (cell != null){
                 int cellType = cell.getCellType();
                 String cellValue= "";
                 switch (cellType){
                     case HSSFCell.CELL_TYPE_STRING: //字符转
                         System.out.print("【STRING】");
                        cellValue = cell.getStringCellValue();
                        break;
                     case HSSFCell.CELL_TYPE_BOOLEAN:  //布尔
                         System.out.print("【BOOLEAN】");
                         cellValue = String.valueOf(cell.getBooleanCellValue());
                         break;
                     case HSSFCell.CELL_TYPE_BLANK:  //空
                         System.out.print("【BLANK】");
                         break;
                     case HSSFCell.CELL_TYPE_NUMERIC: //数字  (日期   普通数字)
                         System.out.print("【NUMERIC】");
                         if (HSSFDateUtil.isCellDateFormatted(cell)){
                             System.out.print("【日期】");
                             Date date = cell.getDateCellValue();
                             cellValue = new DateTime(date).toString("yyyy-MM-dd");
                         }else {
                             //不是日期类型
                             System.out.print("【转换为字符串输出】");
                             cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                             cellValue = cell.toString();
                         }
                         break;
                     case HSSFCell.CELL_TYPE_ERROR: //异常
                         System.out.print("【异常】");
                 }
                 System.out.println(cellValue);
             }
         }
     }
 }
 fileInputStream.close();
}

计算公式

@Test
public void testFormula() throws Exception {
 //获取文件流
 FileInputStream fileInputStream = new FileInputStream(path + "计算公式.xls");
 //创建一个工作簿
 Workbook workbook = new HSSFWorkbook(fileInputStream);
 Sheet sheetAt = workbook.getSheetAt(0);

 Row row = sheetAt.getRow(4);
 Cell cell = row.getCell(0);
 //拿到计算公式 eval
 FormulaEvaluator FormulaEvaluator = new HSSFFormulaEvaluator((HSSFWorkbook)workbook);

 //输出单元格的内容
 int cellType = cell.getCellType();
 switch (cellType){
     case HSSFCell.CELL_TYPE_FORMULA: //公式
         //获取计算公式
         String formula = cell.getCellFormula();
         System.out.println(formula);

         //计算
         CellValue evaluate = FormulaEvaluator.evaluate(cell);
         String cellValue = evaluate.formatAsString();
         System.out.println(cellValue);
         break;
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值