- 浏览: 914929 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (537)
- Java SE (114)
- Struts (18)
- Hibernate (25)
- Spring (3)
- Page_Tech (41)
- Others (87)
- Database (29)
- Server (24)
- OpenSource_Tools (15)
- IDE_Tool (22)
- Algorithm (28)
- Interview (22)
- Test (28)
- Hardware (1)
- Mainframe (25)
- Web application (4)
- Linux (3)
- PHP (17)
- Android (1)
- Perl (6)
- ubuntu (1)
- Java EE (9)
- Web Analysis (5)
- Node.js (2)
- javascript (2)
最新评论
-
一键注册:
request.getRequestURL()和request.getRequestURI() -
SuperCustomer:
...
SED的暂存空间和模式空间 -
juyo_ch:
讲得挺好理解的,学习了
java 死锁及解决 -
chinaalex:
最后一题答案正确,但是分析有误.按照如下过程,上一行为瓶,下一 ...
zz智力题 -
liaowuxukong:
多谢博主啦,弱弱的了解了一点。
C++/Java 实现多态的方法(C++)
前段时间,做POI导出的时候,应为数据量大(十万条数据),所以总是出现OOM错误,在网上找到了解决办法,大数据量导出Excel的方案:http://devbbs.doit.com.cn/redirect.php?tid=46&goto=lastpost
解决大批量数据导出Excel产生内存溢出的方案:http://cnaning.iteye.com/blog/347158
解决大批量数据导出Excel产生内存溢出的方案(二):http://cnaning.iteye.com/blog/347160
- import java.io.ByteArrayInputStream;
- import java.io.File;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Map;
- import org.apache.log4j.Logger;
- import org.apache.poi.hssf.model.Sheet;
- import org.apache.poi.hssf.model.Workbook;
- import org.apache.poi.hssf.record.CellValueRecordInterface;
- import org.apache.poi.hssf.record.LabelRecord;
- import org.apache.poi.hssf.record.LabelSSTRecord;
- import org.apache.poi.hssf.record.Record;
- import org.apache.poi.hssf.record.RowRecord;
- import org.apache.poi.hssf.record.SSTRecord;
- import org.apache.poi.hssf.record.UnicodeString;
- import org.apache.poi.poifs.filesystem.POIFSFileSystem;
- import org.apache.struts.taglib.html.RewriteTag;
- @SuppressWarnings("unchecked")
- public class XlsMergeUtil {
- private static Logger logger = Logger.getLogger(XlsMergeUtil.class);
- /**
- * 将多个Xls文件合并为一个,适用于只有一个sheet,并且格式相同的文档
- *
- * @param inputs
- * 输入的Xls文件,第一个XLS文件必须给出足够sheet空间 例如,总共200000行数据,第一个文件至少3个空白sheet
- * @param out
- * 输出文件
- */
- public static void merge(InputStream[] inputs, OutputStream out) {
- if (inputs == null || inputs.length <= 1) {
- throw new IllegalArgumentException("没有传入输入流数组,或只有一个输入流.");
- }
- List<Record> rootRecords = getRecords(inputs[0]);
- Workbook workbook = Workbook.createWorkbook(rootRecords);
- List<Sheet> sheets = getSheets(workbook, rootRecords);
- if (sheets == null || sheets.size() == 0) {
- throw new IllegalArgumentException("第一篇文档的格式错误,必须有至少一个sheet");
- }
- // 以第一篇文档的第一个sheet为根,以后的数据都追加在这个sheet后面
- Sheet rootSheet = sheets.get(0);
- int rootRows = getRowsOfSheet(rootSheet); // 记录第一篇文档的行数,以后的行数在此基础上增加
- rootSheet.setLoc(rootSheet.getDimsLoc());
- Map<Integer, Integer> map = new HashMap(10000);
- int sheetIndex = 0;
- for (int i = 1; i < inputs.length; i++) { // 从第二篇开始遍历
- List<Record> records = getRecords(inputs[i]);
- // 达到最大行数限制,换一个sheet
- if (getRows(records) + rootRows >= RowRecord.MAX_ROW_NUMBER) {
- if ((++sheetIndex) > (sheets.size() - 1)) {
- logger.warn("第一个文档给出的sheets小于需要的数量,部分数据未能合并.");
- break;
- }
- rootSheet = sheets.get(sheetIndex);
- rootRows = getRowsOfSheet(rootSheet);
- rootSheet.setLoc(rootSheet.getDimsLoc());
- logger.debug("切换Sheet" + sheetIndex + "");
- }
- int rowsOfCurXls = 0;
- // 遍历当前文档的每一个record
- for (Iterator itr = records.iterator(); itr.hasNext();) {
- Record record = (Record) itr.next();
- if (record.getSid() == RowRecord.sid) { // 如果是RowRecord
- RowRecord rowRecord = (RowRecord) record;
- // 调整行号
- rowRecord.setRowNumber(rootRows + rowRecord.getRowNumber());
- rootSheet.addRow(rowRecord); // 追加Row
- rowsOfCurXls++; // 记录当前文档的行数
- }
- // SST记录,SST保存xls文件中唯一的String,各个String都是对应着SST记录的索引
- else if (record.getSid() == SSTRecord.sid) {
- SSTRecord sstRecord = (SSTRecord) record;
- for (int j = 0; j < sstRecord.getNumUniqueStrings(); j++) {
- int index = workbook.addSSTString(sstRecord
- .getString(j));
- // 记录原来的索引和现在的索引的对应关系
- map.put(Integer.valueOf(j), Integer.valueOf(index));
- }
- } else if (record.getSid() == LabelSSTRecord.sid) {
- LabelSSTRecord label = (LabelSSTRecord) record;
- // 调整SST索引的对应关系
- label.setSSTIndex(map.get(Integer.valueOf(label
- .getSSTIndex())));
- }
- // 追加ValueCell
- if (record instanceof CellValueRecordInterface) {
- CellValueRecordInterface cell = (CellValueRecordInterface) record;
- int cellRow = cell.getRow() + rootRows;
- cell.setRow(cellRow);
- rootSheet.addValueRecord(cellRow, cell);
- }
- }
- rootRows += rowsOfCurXls;
- }
- byte[] data = getBytes(workbook, sheets.toArray(new Sheet[0]));
- write(out, data);
- }
- static void write(OutputStream out, byte[] data) {
- POIFSFileSystem fs = new POIFSFileSystem();
- // Write out the Workbook stream
- try {
- fs.createDocument(new ByteArrayInputStream(data), "Workbook");
- fs.writeFilesystem(out);
- out.flush();
- } catch (IOException e) {
- e.printStackTrace();
- } finally {
- try {
- out.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
- static List<Sheet> getSheets(Workbook workbook, List records) {
- int recOffset = workbook.getNumRecords();
- int sheetNum = 0;
- // convert all LabelRecord records to LabelSSTRecord
- convertLabelRecords(records, recOffset, workbook);
- List<Sheet> sheets = new ArrayList();
- while (recOffset < records.size()) {
- Sheet sh = Sheet.createSheet(records, sheetNum++, recOffset);
- recOffset = sh.getEofLoc() + 1;
- if (recOffset == 1) {
- break;
- }
- sheets.add(sh);
- }
- return sheets;
- }
- static int getRows(List<Record> records) {
- int row = 0;
- for (Iterator itr = records.iterator(); itr.hasNext();) {
- Record record = (Record) itr.next();
- if (record.getSid() == RowRecord.sid) {
- row++;
- }
- }
- return row;
- }
- static int getRowsOfSheet(Sheet sheet) {
- int rows = 0;
- sheet.setLoc(0);
- while (sheet.getNextRow() != null) {
- rows++;
- }
- return rows;
- }
- @SuppressWarnings("deprecation")
- static List<Record> getRecords(InputStream input) {
- try {
- POIFSFileSystem poifs = new POIFSFileSystem(input);
- InputStream stream = poifs.getRoot().createDocumentInputStream(
- "Workbook");
- return org.apache.poi.hssf.record.RecordFactory.createRecords(stream);
- } catch (IOException e) {
- logger.error("IO异常:" + e.getMessage() + "");
- e.printStackTrace();
- }
- return Collections.EMPTY_LIST;
- }
- static void convertLabelRecords(List records, int offset, Workbook workbook) {
- for (int k = offset; k < records.size(); k++) {
- Record rec = (Record) records.get(k);
- if (rec.getSid() == LabelRecord.sid) {
- LabelRecord oldrec = (LabelRecord) rec;
- records.remove(k);
- LabelSSTRecord newrec = new LabelSSTRecord();
- int stringid = workbook.addSSTString(new UnicodeString(oldrec
- .getValue()));
- newrec.setRow(oldrec.getRow());
- newrec.setColumn(oldrec.getColumn());
- newrec.setXFIndex(oldrec.getXFIndex());
- newrec.setSSTIndex(stringid);
- records.add(k, newrec);
- }
- }
- }
- public static byte[] getBytes(Workbook workbook, Sheet[] sheets) {
- // HSSFSheet[] sheets = getSheets();
- int nSheets = sheets.length;
- // before getting the workbook size we must tell the sheets that
- // serialization is about to occur.
- for (int i = 0; i < nSheets; i++) {
- sheets[i].preSerialize();
- }
- int totalsize = workbook.getSize();
- // pre-calculate all the sheet sizes and set BOF indexes
- int[] estimatedSheetSizes = new int[nSheets];
- for (int k = 0; k < nSheets; k++) {
- workbook.setSheetBof(k, totalsize);
- int sheetSize = sheets[k].getSize();
- estimatedSheetSizes[k] = sheetSize;
- totalsize += sheetSize;
- }
- logger.debug("分配内存" + totalsize + "bytes");
- byte[] retval = new byte[totalsize];
- int pos = workbook.serialize(0, retval);
- for (int k = 0; k < nSheets; k++) {
- int serializedSize = sheets[k].serialize(pos, retval);
- if (serializedSize != estimatedSheetSizes[k]) {
- // Wrong offset values have been passed in the call to
- // setSheetBof() above.
- // For books with more than one sheet, this discrepancy would
- // cause excel
- // to report errors and loose data while reading the workbook
- throw new IllegalStateException(
- "Actual serialized sheet size (" + serializedSize
- + ") differs from pre-calculated size ("
- + estimatedSheetSizes[k] + ") for sheet (" + k
- + ")");
- // write mis-aligned offsets either
- }
- pos += serializedSize;
- }
- return retval;
- }
- }
发表评论
-
POI大数据量导出
2010-10-28 15:44 2508前段时间,做POI导出的时候,应为数据量大(十万条数据),所以 ... -
Maven生命周期详解
2010-10-21 17:25 732Maven强大的一个重要的 ... -
log4j 详解
2010-10-09 15:37 797把log4j.properties或是log4j. ... -
Ant与Maven比较
2010-08-22 10:30 827两者之间的比较: 第一:ant脚本是可以直接运行在maven中 ... -
如何在tomcat下部署Drools的BRMS
2010-02-28 23:03 1702Installing BRMS in Tomcat 6.0.x ... -
jBPM工作流应用
2010-02-24 18:00 1370一、 环境配置 基础环 ... -
log4j 使用
2010-02-04 22:29 755在强调可重用组件开发的今天,除了自己从头到尾开发一个可重用的日 ... -
Drools安装配置学习笔记
2010-01-05 22:29 64021. 下载drools相关的最 ... -
Drools规则语法
2010-01-05 22:10 2165一个典型的DRL文件: Java代码 ①p ... -
maven2完全使用手册
2010-01-05 21:19 961Maven2完全使用手册 maven2 起步 相信ma ... -
JAVA EXCEL API简介
2009-12-01 09:57 1007JAVA EXCEL API简介 http://www.an ... -
POI HSSFSTYLE
2009-11-18 17:32 1194/** * 生成Excel表,可以指定行的高度以及对内容相同 ... -
POI读写Excel文件(转)- -
2009-11-18 17:28 2395Java代码 POI读写Exc ... -
POI操作Excel文档-中级篇
2009-11-18 17:01 10911、遍历workbook Java代码 ...
相关推荐
以下是一个简化的示例,演示了如何使用POI导出Excel: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileOutputStream; import java.io....
POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI导出POI...
springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式Excel模板,完整项目,导出即用。springboot+poi导出指定格式...
java使用POI导出 Excel+图片工具类 ,里面含有poi jar包,只调用接口即可直接保存Excel。使用的时候需先把数据封装,具体包装需根据实际导出数据进行处理。文件demo中只提供包装格式。
Struts2和Apache POI是Java开发中处理Web应用程序数据导出到Excel的常用工具。...以上就是使用Struts2和Apache POI导出数据到Excel的基本流程和关键知识点,实际应用中可能需要根据具体需求进行调整和优化。
使用POI导出Excel文件** 导出Excel文件主要涉及以下几个步骤: - **创建Workbook对象**:这是Excel文件的容器,可以使用`XSSFWorkbook`(针对.xlsx)或`HSSFWorkbook`(针对.xls)创建。 - **创建Sheet对象**:...
七、导出Excel文件 最后,将Workbook写入OutputStream或File,完成导出: ```java try (FileOutputStream out = new FileOutputStream("output.xlsx")) { workbook.write(out); } catch (IOException e) { e....
Apache POI 是一个开源项目,专门用于处理 Microsoft Office 格式的文件,如 Word、Excel 和 PowerPoint。...在实际项目中,这样的工具可以极大地提升开发效率,减少处理 Excel 文件时遇到的问题。
在这个“POI导出Excel表格”的实例中,我们将深入探讨如何利用Apache POI进行Excel文件的导入与导出操作。 首先,我们需要在项目中集成Apache POI库。如果你使用的是Maven,可以在pom.xml文件中添加以下依赖: ```...
本教程将详细讲解如何使用Apache POI在Web环境中导出Excel表格,避免生成不必要的临时文件,从而优化系统资源管理。 一、Apache POI简介 Apache POI 是一个开源项目,它提供了Java API来处理Microsoft的Office格式...
以上就是使用Java POI导出Excel的基本步骤。你可以根据实际需求调整代码,例如添加数据遍历、样式设置、图表生成等功能。确保正确管理资源,避免内存泄漏,特别是在服务器端处理大量数据时。记得在完成后关闭工作簿...
poi作为导出excel常用的工具,方便快捷。对于excel指定下拉列表的列,如何生成呢?本文提供如何生成下拉列表的excel列
通过以上步骤,我们成功地实现了使用Apache POI在Java中导出Excel文件,并实现了自动换行的功能。这种方式不仅可以提高工作效率,还能确保数据的准确性和完整性。 #### 六、注意事项与优化建议 - **兼容性问题**:...
在这个例子中,我们看到如何使用POI库来将数据从数据库导出到Excel文件中。以下是关于这个话题的详细知识点: 1. **Apache POI**: Apache POI 是一个开源项目,它允许开发人员使用Java读取、写入和修改Microsoft ...
Java POI导出图片到Excel示例代码详解 Java POI是Java开发中常用的开源库,用于读写Microsoft Office文件格式,包括Excel、Word、PowerPoint等。今天,我们将介绍如何使用Java POI将图片导出到Excel中。 标题解释 ...
2. **通过模板导出Excel表格**: - 在开发中,通常会预先准备好一个Excel模板文件,这个模板文件包含了固定格式和一些基本的数据结构。 - Java程序通过读取这个模板文件,然后填充数据,最后将填充后的文件导出为...
保存并导出Excel文件 完成数据填充后,最后一步是关闭工作簿并将Excel文件保存到指定路径。根据给定代码示例,在保存之前还进行了文件路径的检查和创建操作。 ```java book.write(); book.close(); ``` #### 五、...
在实际项目中,你可能会遇到性能优化的问题,因为 POI 直接操作内存模型可能导致内存消耗较大。为了解决这个问题,可以考虑使用SXSSFWorkbook,它允许以流式方式处理 Excel 文件,从而降低内存占用。 总之,利用 ...
Java POI 实现 Excel 导入导出 Java POI 是一个流行的 Java 库,用于处理 Microsoft Office 文件格式,包括 Excel 文件。在本文中,我们将详细介绍如何使用 Java POI 实现 Excel 导入导出功能。 1. 什么是 Java ...
"poi导出excel需要的jar"指的是在使用Apache POI进行Excel导出时,你需要包含特定的JAR依赖文件。 首先,要实现POI导出Excel的功能,你需要下载Apache POI相关的JAR文件。这些文件通常包括以下核心组件: 1. **poi...