当前位置: 首页 > news >正文

POI读和写

文件导出(用户数据导出)和导入(习题上传)。

Apache POI 是一种流行的 API,允许程序员使用 Java 程序创建、修改和显示 MS Office 文件

  • HSSF (Horrible Spreadsheet Format) − 用于读写xls格式的MS-Excel文件。

  • XSSF (XML Spreadsheet Format) − 用于MS-Excel 的xlsx 文件格式。

  • HPSF (Horrible Property Set Format) − 它用于提取 MS-Office 文件的 属性集

  • HWPF (Horrible Word Processor Format) − 用于读写MS-Word 的doc 扩展文件。

  • XWPF (XML Word Processor Format) − 用于读写MS-Word的docx扩展文件。

  • HSLF (Horrible Slide Layout Format) − 它用于阅读、创建和编辑 PowerPoint 演示文稿。

  • HDGF (Horrible DiaGram Format) − 它包含 MS-Visio 二进制文件的类和方法。

POI写

HSSWorkbook和XSSWorkbook

  • HSSFWorkbook − 此类具有读取和写入 .xls 格式的 Microsoft Excel 文件的方法。 它与 MS-Office 版本 97-2003 兼容。

  • XSSFWorkbook − 此类具有读取和写入 .xls 或 .xlsx 格式的 Microsoft Excel 和 OpenOffice xml 文件的方法。 它与 MS-Office 2007 或更高版本兼容。

导入依赖:(xls)poi、(xlsx)poi-ooxml、(日期格式化工具)joda-time

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><!-- https://mvnrepository.com/artifact/joda-time/joda-time --><dependency><groupId>joda-time</groupId><artifactId>joda-time</artifactId><version>2.10.10</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.1</version><scope>test</scope></dependency>

处理excel表主要是处理:工作薄、工作表、行、列下面03和07不同点主要是拼接后缀一个是xls 一个是xlsx 一个调用HSSWorkbook,一个调用XSSFWorkbook。


public class ExcelWriteTest {String PATH="D:\\work\\POI\\Poi-demo\\";@Testpublic void testWrite03() throws IOException {//创建工作薄03版的Workbook workbook=new HSSFWorkbook();//创建工作表,通过工作薄创建工作表,对应sheet1Sheet sheet = workbook.createSheet("商品表");//创建行,从0开始Row row1 = sheet.createRow(0);//创建单元格,第1行的第一列(0,0)Cell cell1 = row1.createCell(0);//写数据到单元格cell1.setCellValue("商品名称");//创建单元格,第1行的第2列(0,1)Cell cell2 = row1.createCell(1);//写数据到单元格cell2.setCellValue("商品价格");//创建单元格,第1行的第2列(0,3)Cell cell = row1.createCell(2);//写数据到单元格cell.setCellValue("时间");//创建行,从0开始Row row2 = sheet.createRow(1);//创建单元格,第2行的第一列(1,0)Cell cell3 = row2.createCell(0);//写数据到单元格cell3.setCellValue("手机");//创建单元格,第2行的第2列(1,1)Cell cell4 = row2.createCell(1);//写数据到单元格cell4.setCellValue("2634");//创建单元格,第2行的第3列(1,2)Cell cell5 = row2.createCell(2);//创建时间并设置日期格式String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell5.setCellValue(time);//生成表(IO流) 03版本是xls结尾FileOutputStream fos = new FileOutputStream(PATH + "商品表.xls");//将工作薄写出workbook.write(fos);//关闭流fos.close();System.out.println("商品表生成");}@Testpublic void testWrite07() throws IOException {//创建工作薄07版的Workbook workbook=new XSSFWorkbook();//创建工作表,通过工作薄创建工作表,对应sheet1Sheet sheet = workbook.createSheet("商品统计表");//创建行,从0开始Row row1 = sheet.createRow(0);//创建单元格,第1行的第一列(0,0)Cell cell1 = row1.createCell(0);//写数据到单元格cell1.setCellValue("商品名称");//创建单元格,第1行的第2列(0,1)Cell cell2 = row1.createCell(1);//写数据到单元格cell2.setCellValue("商品价格");//创建单元格,第1行的第2列(0,3)Cell cell = row1.createCell(2);//写数据到单元格cell.setCellValue("时间");//创建行,从0开始Row row2 = sheet.createRow(1);//创建单元格,第2行的第一列(1,0)Cell cell3 = row2.createCell(0);//写数据到单元格cell3.setCellValue("手机");//创建单元格,第2行的第2列(1,1)Cell cell4 = row2.createCell(1);//写数据到单元格cell4.setCellValue("2634");//创建单元格,第2行的第3列(1,2)Cell cell5 = row2.createCell(2);//创建时间并设置日期格式String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");cell5.setCellValue(time);//生成表(IO流) 07版本是xlsx结尾FileOutputStream fos = new FileOutputStream(PATH + "商品统计表.xlsx");//将工作薄写出workbook.write(fos);//关闭流fos.close();System.out.println("商品统计表生成");}
}

大文件写HSSFWorkbook和XSSFWorkbook

写03版文件,速度较快:用的对象是HSSFWorkbook。

@Testpublic void testWrite03BigData() throws IOException {//获取执行前的时间戳long begin = System.currentTimeMillis();//创建工作薄Workbook workbook=new HSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写入数据for (int rowNum=0;rowNum<65535;rowNum++){Row row = sheet.createRow(rowNum);for (int cellNum=0;cellNum<5;cellNum++){Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("over");FileOutputStream fos = new FileOutputStream(PATH + "Write03BigData.xls");workbook.write(fos);fos.close();//获取结束的时间戳long end = System.currentTimeMillis();System.out.println((double) (end-begin)/1000);}

但是超过65535行会报异常。

XSSFWorkbook:

缺点:写数据速度非常慢,耗费内存。会发生内存溢出,

优点:可以写较大的数据量

@Testpublic void testWrite07BigData() throws IOException {//获取执行前的时间戳long begin = System.currentTimeMillis();//创建工作薄Workbook workbook=new XSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写入数据for (int rowNum=0;rowNum<65535;rowNum++){Row row = sheet.createRow(rowNum);for (int cellNum=0;cellNum<5;cellNum++){Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("07over");FileOutputStream fos = new FileOutputStream(PATH + "Write07BigData.xlsx");workbook.write(fos);fos.close();//获取结束的时间戳long end = System.currentTimeMillis();System.out.println((double) (end-begin)/1000);}

大文件写SXSSFWorkbook

优点:可以写非常大的数据量,100万条甚至更多,写数据速度快,占用更少的内存。

注意内存监控。

默认100条数据存储在内存中,超过的数据被写入临时文件。临时文件一定要清理。

 @Testpublic void testWrite07BigDataS() throws IOException {//获取执行前的时间戳long begin = System.currentTimeMillis();//创建工作薄Workbook workbook=new SXSSFWorkbook();//创建表Sheet sheet = workbook.createSheet();//写入数据for (int rowNum=0;rowNum<65535;rowNum++){Row row = sheet.createRow(rowNum);for (int cellNum=0;cellNum<5;cellNum++){Cell cell = row.createCell(cellNum);cell.setCellValue(cellNum);}}System.out.println("07overs");FileOutputStream fos = new FileOutputStream(PATH + "Write07BigDataS.xlsx");workbook.write(fos);fos.close();//关闭临时文件((SXSSFWorkbook)workbook).dispose();//获取结束的时间戳long end = System.currentTimeMillis();System.out.println((double) (end-begin)/1000);}

POI读

03版和07版使用的类和写是一样的:HSSWorkbook和XSSWorkbook


public class ExcelReadTest {String PATH="D:\\work\\POI\\Poi-demo\\";@Testpublic void testRead03() throws IOException{//创建工作薄03版的//获取流FileInputStream fileInputStream = new FileInputStream(PATH+"商品表.xls");//得到表Workbook workbook=new HSSFWorkbook(fileInputStream);//拿出数据Sheet sheet = workbook.getSheetAt(0);Row row = sheet.getRow(0);Cell cell = row.getCell(0);System.out.println(cell.getStringCellValue());fileInputStream.close();}@Testpublic void testRead07() throws IOException{//创建工作薄03版的//获取流FileInputStream fileInputStream = new FileInputStream(PATH+"商品统计表.xlsx");//得到表Workbook workbook=new XSSFWorkbook(fileInputStream);//拿出数据Sheet sheet = workbook.getSheetAt(0);Row row = sheet.getRow(0);Cell cell = row.getCell(0);System.out.println(cell.getStringCellValue());fileInputStream.close();}}

读取不同的数据类型

先获取第一行,都是String型。

@Testpublic void CellType() throws Exception {FileInputStream fileInputStream = new FileInputStream(PATH+"post_1755673349891.xlsx");//创建工作薄,Workbook workbook = new XSSFWorkbook(fileInputStream);Sheet sheet = workbook.getSheetAt(0);//获取标题内容Row rowTitle = sheet.getRow(0);if (rowTitle!=null){//通过方法遍历所有的列cellCount数量int cellCount = rowTitle.getPhysicalNumberOfCells();for (int cellNum=0;cellNum<cellCount;cellNum++){Cell cell = rowTitle.getCell(cellNum);if (cell!=null){//获取单元格的类型CellType cellType = cell.getCellType();String cellValue = cell.getStringCellValue();System.out.print(cellValue+"|");}}System.out.println();}//读取表中的内容//获取有多少行rowNumint rowCount = sheet.getPhysicalNumberOfRows();for (int rowNum=1;rowNum<rowCount;rowNum++){//读取行中的数据Row 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)+"]");//获取列中的数据Cell cell = rowData.getCell(cellNum);//匹配列的数据类型if (cell!=null){CellType cellType = cell.getCellType();String cellValue="";switch (cellType){case STRING:System.out.print("String");cellValue = cell.getStringCellValue();break;case BOOLEAN:System.out.print("Boolean");//强制转换为字符串cellValue =String.valueOf(cell.getBooleanCellValue()) ;break;case _NONE:System.out.print("None");break;case NUMERIC:System.out.print("NUMERIC");if (DateUtil.isCellDateFormatted(cell)){//日期System.out.print("日期");Date date = cell.getDateCellValue();cellValue = new DateTime(date).toString("yyyy-MM-dd");}else {//不是日期格式,防止数字过长System.out.print("转换为字符串输出");cell.setCellValue(HSSFCell.ENCODING_UTF_16);//cellValue =String.valueOf(cell.getDateCellValue()) ;cellValue=cell.toString();}break;case ERROR:System.out.print("类型错误");break;}System.out.println(cellValue);}}}}fileInputStream.close();}

EasyExcel

基于Java的简单、省内存的读写Excel的阿里开源项目。

需要导入依赖,可看官方文档:关于Easyexcel | Easy Excel 官网

http://www.dtcms.com/a/343188.html

相关文章:

  • C2ComponentStore
  • CMOS知识点 MOS管线性区电流公式
  • Linux 网络命令大全
  • 在VSCode中配置.NET项目的tasks.json以实现清理、构建、热重载和发布等操作
  • vue2 watch 用法
  • K8s安全管理与持久化存储实战指南
  • Seaborn数据可视化实战:Seaborn入门-环境搭建与基础操作
  • Seaborn数据可视化实战
  • AI对口型唱演:科技赋能,开启虚拟歌者新篇章
  • 刷机维修进阶教程-----如何清除云账号 修复wifi 指南针 相机 指纹等刷机故障
  • 自然处理语言NLP:One-Hot编码、TF-IDF、词向量、NLP特征输入、EmbeddingLayer实现、word2vec
  • Linux 802.11协议栈深度分析与实践指南
  • 车机两分屏运行Unity制作的效果
  • OpenAI重新开源!gpt-oss-20b适配昇腾并上线魔乐社区
  • WebSocket连接的例子
  • 链游开发新篇章:融合区块链技术的游戏创新与探索
  • 什么是撮合引擎
  • 模型的量化-nf4和pf4
  • 基于STM32F103单片机智能门禁热释人体感应报警设计
  • C#串口单例 + 端口复用
  • LCD DMA day59
  • 为何vivo做了头显,小米却选择AI眼镜
  • 【GNSS基带算法】Chapter.2 相干积分与非相干积分
  • 基于 .NET Core Web API 请求 Nacos 配置中心的最佳实践
  • 微服务01-微服务架构:Java中的最佳实践
  • 业务扩展字段系统设计理念与流程图
  • LeetCode_动态规划
  • 【NLP(01)】NLP(自然语言处理)基础
  • nginx-自制证书实现
  • Python学习 -- MySQL数据库的查询及案例