首页 > 其他分享 >使用Apache POI操作Excel

使用Apache POI操作Excel

时间:2024-06-05 09:59:14浏览次数:9  
标签:cellnum 单元格 Excel SXSSFWorkbook POI Apache import rownum 模板

案例一:(创建工作表)

在使用Apache POI操作Excel时,如果要处理大量的数据(例如十万级别的行),则需要特别注意性能优化。以下是一些优化建议和详细说明:

  1. 使用SXSSFWorkbook:SXSSFWorkbook是XSSFWorkbook的流式版本,可以有效地节省内存,因为它会将数据写入磁盘而不是全部保存在内存中。这是处理大量数据时首选的工作簿实现。

  2. 减少对单元格样式的修改:单元格样式占用内存较多,尽量减少对单元格样式的修改,尤其是在循环中。如果需要设置样式,尽量重用已经创建的样式。

  3. 使用事件用户模型(Event User Model):Apache POI还提供了事件用户模型,允许你以流的方式读取和写入Excel文件,这种方式特别适合处理非常大的文件。

  4. 分批写入数据:如果可能,可以将数据分批写入Excel,而不是一次性写入所有数据。例如,可以将数据分为多个工作表,或者将数据分多个文件保存。

  5. 优化你的数据结构:在写入Excel之前,尽量优化你的数据结构,减少不必要的计算和转换。

  6. 使用多线程:如果适用,可以使用多线程来并行处理数据,但请注意,这可能会增加代码的复杂性,并且需要确保线程安全。

  7. 关闭自动刷新:如果使用SXSSFWorkbook,可以通过调用setAutoFlush(false)来关闭自动刷新,这会在调用flushRows或flushRows时手动控制刷新。

下面是一个详细的代码示例,展示了如何使用SXSSFWorkbook来优化性能,以处理大约十万行的数据:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelPerformanceOptimization {
    public static void main(String[] args) throws IOException {
        // 使用SXSSFWorkbook,它是XSSFWorkbook的流式版本,适合处理大量数据
        try (SXSSFWorkbook workbook = new SXSSFWorkbook()) {
            // 创建一个工作表
            Sheet sheet = workbook.createSheet("Sheet1");

            // 定义数据行数,这里我们假设是十万行
            int numRows = 100000;

            // 开始时间
            long startTime = System.currentTimeMillis();

            // 循环创建行和单元格
            for (int rownum = 0; rownum < numRows; rownum++) {
                // 创建行
                Row row = sheet.createRow(rownum);

                // 假设每行有10列
                for (int cellnum = 0; cellnum < 10; cellnum++) {
                    // 创建单元格
                    Cell cell = row.createCell(cellnum);

                    // 设置单元格值
                    cell.setCellValue("Data " + rownum + " " + cellnum);
                }

                // 每创建1000行刷新一次到磁盘,以释放内存
                if (rownum % 1000 == 0) {
                    ((SXSSFSheet) sheet).flushRows(1000);
                }
            }

            // 结束时间
            long endTime = System.currentTimeMillis();

            // 输出执行时间
            System.out.println("Execution time: " + (endTime - startTime) + " ms");

            // 将工作簿写入文件
            try (FileOutputStream out = new FileOutputStream("large-data.xlsx")) {
                workbook.write(out);
            }
        }
    }
}

案例二:(使用本地模板)

在使用Apache POI操作Excel时,如果想通过使用本地模板来优化性能,尤其是在处理大量数据时,可以采取以下步骤:

  1. 使用模板文件:首先,您需要一个Excel模板文件(.xlsx),其中包含您想要预先定义的样式、公式、图像等。

  2. 读取模板文件:使用XSSFWorkbookSXSSFWorkbook(如果数据量很大)来读取模板文件。

  3. 修改模板内容:根据需要修改模板中的内容,例如填充数据、修改公式等。

  4. 写入数据:将您的数据写入到工作簿中,尽量使用批量写入操作来提高效率。

  5. 刷新和保存:如果使用SXSSFWorkbook,定期刷新数据到磁盘以释放内存,最后保存修改后的工作簿。

以下是一个示例代码,展示了如何使用Apache POI和SXSSFWorkbook来优化性能,同时使用本地模板文件:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class ExcelPerformanceOptimizationWithTemplate {
    public static void main(String[] args) throws IOException {
        // 定义模板文件路径
        String templateFilePath = "template.xlsx";
        // 定义输出文件路径
        String outputFilePath = "output.xlsx";

        // 使用SXSSFWorkbook,它是XSSFWorkbook的流式版本,适合处理大量数据
        try (SXSSFWorkbook workbook = new SXSSFWorkbook()) {
            // 读取模板文件
            try (FileInputStream fis = new FileInputStream(templateFilePath)) {
                XSSFWorkbook templateWorkbook = new XSSFWorkbook(fis);
                // 复制模板中的所有样式和属性到SXSSFWorkbook
                workbook.setWorkbookType(templateWorkbook.getWorkbookType());
                workbook.cloneStyleFromWorkbook(templateWorkbook);
            }

            // 创建一个工作表
            Sheet sheet = workbook.createSheet("Sheet1");

            // 定义数据行数,这里我们假设是十万行
            int numRows = 100000;

            // 开始时间
            long startTime = System.currentTimeMillis();

            // 循环创建行和单元格
            for (int rownum = 0; rownum < numRows; rownum++) {
                // 创建行
                Row row = sheet.createRow(rownum);

                // 假设每行有10列
                for (int cellnum = 0; cellnum < 10; cellnum++) {
                    // 创建单元格
                    Cell cell = row.createCell(cellnum);

                    // 设置单元格值
                    cell.setCellValue("Data " + rownum + " " + cellnum);
                }

                // 每创建1000行刷新一次到磁盘,以释放内存
                if (rownum % 1000 == 0) {
                    ((SXSSFSheet) sheet).flushRows(1000);
                }
            }

            // 结束时间
            long endTime = System.currentTimeMillis();

            // 输出执行时间
            System.out.println("Execution time: " + (endTime - startTime) + " ms");

            // 将工作簿写入文件
            try (FileOutputStream out = new FileOutputStream(outputFilePath)) {
                workbook.write(out);
            }
        }
    }
}

在这个示例中,我们首先读取了一个模板文件,并将其样式和属性复制到了SXSSFWorkbook中。然后,我们创建了一个新的工作表,并在其中循环创建了大量的行和单元格。每创建1000行,我们就刷新一次数据到磁盘,以避免内存溢出。最后,我们将修改后的工作簿保存到了一个新文件中。

标签:cellnum,单元格,Excel,SXSSFWorkbook,POI,Apache,import,rownum,模板
From: https://blog.csdn.net/qq_40660389/article/details/139418124

相关文章

  • 百万级表格实测,excel是时侯使用XLOOKUP了,比VLOOKUP简单、不出错、快
    使用场景:用“证件号码”查找“Sheet4表”(272181行)的“姓名”列,填充到“Sheet1”表的空白列中。为了演示传说中的二进制查找,我们预先对“Sheet4”进行了按“证件号码”排序。1、VLOOKUP:我们第一次使用公式为:=VLOOKUP(B2,Sheet4!$A$2:$B$272181,1,FALSE),这个公式并没有找到数据......
  • 一键导入excel电子表格到mysql,一次导入100个100万行的电子表,合并导入到一张数据库表里
       适用场景:从数据库中同一张大数据表导出的N个excel表格,他们的结构是相同的。那你说我不需要这个功能,我分表导入数据库,然后我写sql语句合并在一起就完事了。我以前也一直是这样处理的。几个表或者十多个表合并成一个表,我们写sql,忍忍也就过去了。但是上百个表合并成一个表......
  • 使用EasyPOI导出的 Excel 表格字段为中文
     导入导出添加依赖:<!--FastDFS分布式文件系统进行交互,实现文件的上传、下载--><dependency><groupId>com.github.tobato</groupId><artifactId>fastdfs-client</artifactId><version>1.26.6......
  • 05-Excel基础操作-学习笔记
    使用分列工具整理数据导出的数据是文本文件即以.txt结尾的文件,放入Excel中,是一种常见的操作。具体操作打开文本格式的数据,Ctrl+A全选——Ctrl+C复制——新建excel表格——点击A1单元格(注意,这里不要双击)——Ctrl+V粘贴——选中A列——数据选项卡——分列——勾选“分隔符号(D)”......
  • Python神技:pd.read_excel怎样读取多sheet页数据
    哈喽,大家好,我是木头左!今天,我要分享的是一个非常实用的Python技能,那就是如何在Python的pandas库中使用pd.read_excel函数来读取Excel文件的多个sheet页数据。一、为什么要读取Excel的多个sheet页数据?在数据分析和处理的过程中,经常需要处理包含多个sheet页的Excel文件。比如,你......
  • Apache SeaTunnel社区5月月报更新!
    各位热爱SeaTunnel的小伙伴们,社区5月份月报来啦!SeaTunnel正在迅猛发展,积极投入社区项目建设的小伙伴将促进SeaTunnel不断提升数据同步的高可扩展性、高性能及高可靠性。欢迎关注每月月报更新,期待在下个月的MergeStar月度榜单看到你的身影哦~SeaTunnel月度MergeStar感谢......
  • pdf如何转换成excel文档?这3个方法免费!
    职场人士常常会遇到PDF文件格式,因为PDF便于传输且能够保持排版稳定,因此在文件分享中备受青睐。然而,PDF文件中的表格数据可能涉及到公式和函数,而PDF格式又不易编辑,这时我们就需要将其转换为Excel格式进行编辑修改。因此,掌握PDF转换成Excel的技能对职场人士来说非常有意义。幸运的......
  • Excel生成sql语句&Python写入数据到数据库
    一、Excel生成sql语句直接按下图步骤操作即可二、Python插入数据库表数据参考博客:https://blog.csdn.net/Q821869063/article/details/1365660211、用excel表准备一份需要插入的数据,如下图2、代码源码如下#--coding=utf-8#导入读取Excel的库fromopenpyxlimportlo......
  • P10536 [Opoi 2024] 二十六点 题解
    比较直接的做法。当\(P_x=1\)时显然可以暴力DP,设\(f_{x,c}\)表示\(x\)的子树中以\(c\)开头的最长不下降子序列的长度。直接转移即可。\(P_x\neq1\)的时候呢?我们发现,所谓“忽略掉这些路径中的第\(2\)到第\(P_x\)个的点”,代表的就是按照深度转移,大概就是这样:......
  • 使用 Python 处理 Excel 表格数据的实用技巧
    简介在日常工作中,处理Excel表格数据是一项常见的任务。Python提供了丰富的库和工具,能够帮助我们高效地处理Excel数据。本篇博客将介绍如何使用openpyxl库来读取Excel表格并进行数据处理,同时展示一个实际案例,说明如何从Excel表格中提取数据并转换为JSON格式进行存......