• poi读写操作


    1.poi介绍

    pache POI [1]  是创建和维护操作各种符合Office Open XML(OOXML)标准和微软的OLE 2复合文档格式(OLE2)的Java API。用它可以使用Java读取和创建,修改MS Excel文件.而且,还可以使用Java读取和创建MS Word和MSPowerPoint文件。Apache POI 提供Java操作Excel解决方案(适用于Excel97-2008)

    2.导入依赖

    03版本xml结尾的只能有65535行,07版以xlsx结尾,没有限制

    1. <dependency>
    2. <groupId>org.apache.poigroupId>
    3. <artifactId>poiartifactId>
    4. <version>3.9version>
    5. dependency>
    6. <dependency>
    7. <groupId>org.apache.poigroupId>
    8. <artifactId>poi-ooxmlartifactId>
    9. <version>3.9version>
    10. dependency>
    11. <dependency>
    12. <groupId>joda-timegroupId>
    13. <artifactId>joda-timeartifactId>
    14. <version>2.10.1version>
    15. dependency>
    16. <dependency>
    17. <groupId>junitgroupId>
    18. <artifactId>junitartifactId>
    19. <version>4.12version>
    20. dependency>

     3.写入Excel

    03版本用的是HSSF,07版本用的是XSSF

    3-1.03测试代码 xls

    1. package com.example.list.controller;
    2. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    3. import org.apache.poi.ss.usermodel.Cell;
    4. import org.apache.poi.ss.usermodel.Row;
    5. import org.apache.poi.ss.usermodel.Sheet;
    6. import org.apache.poi.ss.usermodel.Workbook;
    7. import org.joda.time.DateTime;
    8. import org.junit.Test;
    9. import java.io.FileOutputStream;
    10. //写测试
    11. public class ExcelWriteTest {
    12. String PATH = "E:\\java\\list\\";
    13. @Test
    14. public void test01() throws Exception {
    15. //1.创建工作簿
    16. Workbook workbook = new HSSFWorkbook();
    17. //2.创建一个工作表
    18. Sheet sheet = workbook.createSheet("统计表");
    19. //第一行
    20. //3.创建一个行
    21. Row row1 = sheet.createRow(0);
    22. //4.创建一个单元格//(1,1)
    23. Cell cell11 = row1.createCell(0);
    24. cell11.setCellValue("今日新增观众");
    25. //4.创建一个单元格//(1,2)
    26. Cell cell12 = row1.createCell(1);
    27. cell12.setCellValue(6666);
    28. //第二行(2,1)
    29. Row row2 = sheet.createRow(1);
    30. Cell cell21 = row2.createCell(0);
    31. cell21.setCellValue("统计时间");
    32. //(2,2)
    33. Cell cell22 = row2.createCell(1);
    34. String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
    35. cell22.setCellValue(time);
    36. //生成一张表
    37. FileOutputStream fileOutputStream = new FileOutputStream(PATH + "统计表03.xls");
    38. workbook.write(fileOutputStream);
    39. fileOutputStream.close();
    40. System.out.println("生成完毕");
    41. }
    42. }

    3-2.07版本xlsx

    1. package com.example.list.controller;
    2. import org.apache.poi.ss.usermodel.Cell;
    3. import org.apache.poi.ss.usermodel.Row;
    4. import org.apache.poi.ss.usermodel.Sheet;
    5. import org.apache.poi.ss.usermodel.Workbook;
    6. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    7. import org.joda.time.DateTime;
    8. import org.junit.Test;
    9. import java.io.FileOutputStream;
    10. //写测试
    11. public class ExcelWriteTest {
    12. String PATH = "E:\\java\\list\\";
    13. @Test
    14. public void test01() throws Exception {
    15. //1.创建工作簿
    16. Workbook workbook = new XSSFWorkbook();
    17. //2.创建一个工作表
    18. Sheet sheet = workbook.createSheet("统计表");
    19. //第一行
    20. //3.创建一个行
    21. Row row1 = sheet.createRow(0);
    22. //4.创建一个单元格//(1,1)
    23. Cell cell11 = row1.createCell(0);
    24. cell11.setCellValue("今日新增观众");
    25. //4.创建一个单元格//(1,2)
    26. Cell cell12 = row1.createCell(1);
    27. cell12.setCellValue(6666);
    28. //第二行(2,1)
    29. Row row2 = sheet.createRow(1);
    30. Cell cell21 = row2.createCell(0);
    31. cell21.setCellValue("统计时间");
    32. //(2,2)
    33. Cell cell22 = row2.createCell(1);
    34. String time = new DateTime().toString("yyyy-MM-dd HH:mm:ss");
    35. cell22.setCellValue(time);
    36. //生成一张表
    37. FileOutputStream fileOutputStream = new FileOutputStream(PATH + "统计表07.xlsx");
    38. workbook.write(fileOutputStream);
    39. fileOutputStream.close();
    40. System.out.println("生成完毕");
    41. }
    42. }

     4.大数据导入

    4-1 03版本

    03版本耗时2.83秒(每个人电脑性能不一样) 03版本只能处理65536行,过程中写入缓存,不操作磁盘,写入速度快

    1. package com.example.list.controller;
    2. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    3. import org.apache.poi.ss.usermodel.Cell;
    4. import org.apache.poi.ss.usermodel.Row;
    5. import org.apache.poi.ss.usermodel.Sheet;
    6. import org.junit.Test;
    7. import java.io.FileOutputStream;
    8. //写测试
    9. public class ExcelWriteTest {
    10. String PATH = "E:\\java\\list\\";
    11. @Test
    12. public void testBigData() throws Exception {
    13. //开始时间
    14. long begin = System.currentTimeMillis();
    15. //创建一个薄
    16. HSSFWorkbook workbook = new HSSFWorkbook();
    17. //创建一个表
    18. Sheet sheet = workbook.createSheet();
    19. //写入数据
    20. //行
    21. for (int rowNum = 0; rowNum < 65536; rowNum++) {
    22. Row row = sheet.createRow(rowNum);
    23. //列
    24. for (int cellNum = 0; cellNum < 10; cellNum++) {
    25. Cell cell = row.createCell(cellNum);
    26. cell.setCellValue(cellNum);
    27. }
    28. }
    29. System.out.println("完成");
    30. FileOutputStream fileOutputStream = new FileOutputStream(PATH + "大数据03.xls");
    31. workbook.write(fileOutputStream);
    32. fileOutputStream.close();
    33. long end = System.currentTimeMillis();
    34. System.out.println((double)( end-begin)/1000);
    35. }
    36. }

    4-2 07版本

    07版本速度慢,写入耗内存,也会内存溢出,我电脑是 4.28秒,处理65536行。

    1. package com.example.list.controller;
    2. import org.apache.poi.ss.usermodel.Cell;
    3. import org.apache.poi.ss.usermodel.Row;
    4. import org.apache.poi.ss.usermodel.Sheet;
    5. import org.apache.poi.ss.usermodel.Workbook;
    6. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    7. import org.junit.Test;
    8. import java.io.FileOutputStream;
    9. //写测试
    10. public class ExcelWriteTest {
    11. String PATH = "E:\\java\\list\\";
    12. @Test
    13. public void testBigData() throws Exception {
    14. //开始时间
    15. long begin = System.currentTimeMillis();
    16. //创建一个薄
    17. Workbook workbook = new XSSFWorkbook();
    18. //创建一个表
    19. Sheet sheet = workbook.createSheet();
    20. //写入数据
    21. //行
    22. for (int rowNum = 0; rowNum < 65536; rowNum++) {
    23. Row row = sheet.createRow(rowNum);
    24. //列
    25. for (int cellNum = 0; cellNum < 10; cellNum++) {
    26. Cell cell = row.createCell(cellNum);
    27. cell.setCellValue(cellNum);
    28. }
    29. }
    30. System.out.println("完成");
    31. FileOutputStream fileOutputStream = new FileOutputStream(PATH + "大数据07.xlsx");
    32. workbook.write(fileOutputStream);
    33. fileOutputStream.close();
    34. long end = System.currentTimeMillis();
    35. System.out.println((double) (end - begin) / 1000);
    36. }
    37. }

    对于写入慢的问题,大文件可以写SCSSF,在写入过程中会生成临时文件,内存只有100条,可以自己修改 

    1. package com.example.list.controller;
    2. import org.apache.poi.ss.usermodel.Cell;
    3. import org.apache.poi.ss.usermodel.Row;
    4. import org.apache.poi.ss.usermodel.Sheet;
    5. import org.apache.poi.ss.usermodel.Workbook;
    6. import org.apache.poi.xssf.streaming.SXSSFWorkbook;
    7. import org.junit.Test;
    8. import java.io.FileOutputStream;
    9. //写测试
    10. public class ExcelWriteTest {
    11. String PATH = "E:\\java\\list\\";
    12. @Test
    13. public void testBigData() throws Exception {
    14. //开始时间
    15. long begin = System.currentTimeMillis();
    16. //创建一个薄
    17. Workbook workbook = new SXSSFWorkbook();
    18. //创建一个表
    19. Sheet sheet = workbook.createSheet();
    20. //写入数据
    21. //行
    22. for (int rowNum = 0; rowNum < 1000000; rowNum++) {
    23. Row row = sheet.createRow(rowNum);
    24. //列
    25. for (int cellNum = 0; cellNum < 10; cellNum++) {
    26. Cell cell = row.createCell(cellNum);
    27. cell.setCellValue(cellNum);
    28. }
    29. }
    30. System.out.println("完成");
    31. FileOutputStream fileOutputStream = new FileOutputStream(PATH + "大数据07.xlsx");
    32. workbook.write(fileOutputStream);
    33. fileOutputStream.close();
    34. //清楚临时文件
    35. ((SXSSFWorkbook)workbook).dispose();
    36. long end = System.currentTimeMillis();
    37. System.out.println((double) (end - begin) / 1000);
    38. }
    39. }

    5.excel读

    5-1 03版本

    1. package com.example.list.controller;
    2. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    3. import org.apache.poi.ss.usermodel.Cell;
    4. import org.apache.poi.ss.usermodel.Row;
    5. import org.apache.poi.ss.usermodel.Sheet;
    6. import org.junit.Test;
    7. import java.io.FileInputStream;
    8. public class ExcelReadTest {
    9. public static final String PATH = "E:\\java\\list\\";
    10. @Test
    11. public void testRead03() throws Exception {
    12. //获取文件流
    13. FileInputStream inputStream = new FileInputStream(PATH+"统计表03.xls");
    14. //创建一个工作薄,
    15. HSSFWorkbook workbook = new HSSFWorkbook(inputStream);
    16. //得到表
    17. Sheet sheet = workbook.getSheetAt(0);
    18. //得到行
    19. Row row = sheet.getRow(0);
    20. //得到列
    21. Cell cell = row.getCell(0);
    22. System.out.println(cell.getStringCellValue());
    23. inputStream.close();
    24. }
    25. }

    5-2 07版本

    1. package com.example.list.controller;
    2. import org.apache.poi.ss.usermodel.Cell;
    3. import org.apache.poi.ss.usermodel.Row;
    4. import org.apache.poi.ss.usermodel.Sheet;
    5. import org.apache.poi.ss.usermodel.Workbook;
    6. import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    7. import org.junit.Test;
    8. import java.io.FileInputStream;
    9. public class ExcelReadTest {
    10. public static final String PATH = "E:\\java\\list\\";
    11. @Test
    12. public void testRead07() throws Exception {
    13. //获取文件流
    14. FileInputStream inputStream = new FileInputStream(PATH+"统计表07.xlsx");
    15. //创建一个工作薄,
    16. Workbook workbook = new XSSFWorkbook(inputStream);
    17. //得到表
    18. Sheet sheet = workbook.getSheetAt(0);
    19. //得到行
    20. Row row = sheet.getRow(0);
    21. //得到列
    22. Cell cell = row.getCell(0);
    23. System.out.println(cell.getStringCellValue());
    24. inputStream.close();
    25. }
    26. }

     

  • 相关阅读:
    开机动画启动 android 9.0
    厉害了!阿里内部都用的Spring+MyBatis源码手册,实战理论两不误
    推荐冷启动召回模型DropoutNet深度解析与改进
    教你2023年计算机毕业设计怎么选题,创新点怎么写
    Vue 源码解读(8)—— 编译器 之 解析(上)
    字符串——子串查找(kmp)
    PowerCLI 通过vCenter批量设置所有esxi主机SNMP
    LeetCode刷题笔记【33】:动态规划专题-5(最后一块石头的重量 II、目标和、一和零)
    Linux 处理文件( touch 命令、cp 命令、mv 命令、rm 命令)
    【全志T113-S3_100ask】1-编译buildroot初体验
  • 原文地址:https://blog.csdn.net/qq_42847719/article/details/128175308