- 浏览: 72149 次
文章分类
- 全部博客 (38)
- ddddddddddd (1)
- java (37)
- Spring中Quartz的Cron表达式详解 (1)
- ORACLE中一个字符占多少字节 (1)
- sssdfd (1)
- jquery演示汉诺塔移动过程 (1)
- PHP中include和require (1)
- 试用CountDownLatch的副成品,多线程群发邮件小程序 (1)
- 金山词霸2005采用新的防止盗版的方法及简单解决方法 (1)
- 如何每天多给自己一小时? (1)
- 时间管理101招 (1)
- Eclipse扩展点笔记 (1)
- ERROR: the user data image is used by another emulator. aborting (1)
- GML对象的层次结构 (1)
- Java读取Word/Excel/PDF可以使用的第三方包 (1)
- 海水与火焰——领导眼中两种不同类型的员工 (1)
- 攘外必先安内 稳定才能发展 员工也是上帝 (1)
- 基于SVG技术实现WebGIS的基本功能(2) (1)
- MapXtreme2004代码 几个地图工具的使用(C#) (1)
- C#编写最小化到系统托盘的Windows应用程序 (1)
- iOS开发之详解剪贴板 (1)
- iOS开发之结合asp.net webservice实现文件上传下载 (1)
- VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布 (1)
- wp数据库方案 (1)
- No action instance for path /leftTreeMenu could be created (1)
- OracleOraDb10g_home1TNSListener服务启动后又停止了 (1)
- 将多个Excel文件合并成一个的源码 (1)
- 悲催的this悲催的new (1)
- 搜索maven依赖的网站推荐 (1)
- Errors occurred during the build. Errors running builder 'JavaScript Validator' (1)
- [转]PKCS12 证书的生成及验证 (1)
- android: not find device (1)
- [转载]对session和cookie的一些理解 (1)
- 域名选择的那些事 (1)
- EJB 调用原理及原因 (1)
最新评论
-
houxinyou:
不论做员工还是做领导,我都喜欢海水!如果每个人都把该自己做的事 ...
海水与火焰——领导眼中两种不同类型的员工 -
zui4yi1:
可以推广到各行各业。
攘外必先安内 稳定才能发展 员工也是上帝
源码是在poi-3.1-FINAL-20080629版本下编译通过。
?
<span style="color: #ff0000;">本源码修正了获取sheet中数据行数的BUG</span>,详情看getRows方法。
public class ExcelMergeUtil { public static void merge(List<String> sourceFiles, String destFile)throws Exception{ InputStream[] inputs = new InputStream[sourceFiles.size()]; for(int i=0; i<sourceFiles.size(); i++) { inputs[i] = new FileInputStream(sourceFiles.get(i)); } OutputStream out = new FileOutputStream(destFile); merge(inputs, out); } public static void merge(InputStream[] inputs, OutputStream out)throws Exception{ Map map = null; try{ if(inputs == null || inputs.length <= 1) { throw new IllegalArgumentException("没有传入输入流数组或只有一个输入流!"); } System.out.println("需要合并的文件数为:" + inputs.length); //第一个文档 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(sheets.size() - 1); int rootRows = getRows(rootRecords); //记录第一篇文档的行数,以后的行数在此基础上增加 rootSheet.setLoc(rootSheet.getDimsLoc()); map = new HashMap(1000); for(int i = 1; i < inputs.length; i++){ //从第二篇开始遍历 List<Record> records = getRecords(inputs[i]); int rowsOfCurXls = 0; //遍历当前文档的每一个record for(Iterator it = records.iterator(); it.hasNext();){ Record record = (Record) it.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( ((Integer)map.get(Integer.valueOf(label.getSSTIndex()))).intValue() ); } //追加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); System.out.println("合并完成"); }finally{ if(map!=null){ map.clear(); map = null; } } } static void write(OutputStream out, byte[] data)throws Exception{ POIFSFileSystem fs = new POIFSFileSystem(); try{ fs.createDocument(new ByteArrayInputStream(data), "Workbook"); fs.writeFilesystem(out); out.flush(); }finally{ try{ out.close(); }catch(IOException e){ e.printStackTrace(); } } } /** * 获取Sheet列表 */ static List<Sheet> getSheets(Workbook workbook, List<Record> records)throws Exception{ int recOffset = workbook.getNumRecords(); int sheetNum = 0; convertLabelRecords(records, recOffset, workbook); List<Sheet> sheets = new ArrayList<Sheet>(); while(recOffset < records.size()){ Sheet sheet = Sheet.createSheet(records, sheetNum++, recOffset); recOffset = sheet.getEofLoc() + 1; if(recOffset == 1) break; sheets.add(sheet); } return sheets; } /** * 取得一个sheet中数据的行数 */ static int getRows(List<Record> records) { int row = 0; for(Iterator it = records.iterator(); it.hasNext();){ Record record = (Record) it.next(); if(record.getSid() == DimensionsRecord.sid){ DimensionsRecord dr = (DimensionsRecord)record; row = dr.getLastRow(); break; } } return row; } /** * 获取Excel文档的记录集 */ static List<Record> getRecords(InputStream input) { try{ POIFSFileSystem poifs = new POIFSFileSystem(input); InputStream stream = poifs.getRoot().createDocumentInputStream("Workbook"); return RecordFactory.createRecords(stream); }catch(IOException e){ System.out.println("ExcelMergeUtil.getRecords: " + e.toString()); e.printStackTrace(); } return Collections.EMPTY_LIST; } static void convertLabelRecords(List<Record> records, int offset, Workbook workbook)throws Exception{ 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); int stringid = workbook.addSSTString(new UnicodeString(oldrec.getValue())); LabelSSTRecord newrec = new LabelSSTRecord(); newrec.setRow(oldrec.getRow()); newrec.setColumn(oldrec.getColumn()); newrec.setXFIndex(oldrec.getXFIndex()); newrec.setSSTIndex(stringid); records.add(k, newrec); } } } static byte[] getBytes(Workbook workbook, Sheet[] sheets) { int nSheets = sheets.length; for(int i = 0; i < nSheets; i++){ sheets[i].preSerialize(); } int totalsize = workbook.getSize(); 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; } 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]){ throw new IllegalStateException("Actual serialized sheet size (" + serializedSize + ") differs from pre-calculated size (" + estimatedSheetSizes[k] + ") for sheet (" + k + ")"); } pos += serializedSize; } return retval; } }
?
发表评论
-
EJB 调用原理及原因
2012-02-04 15:03 1076这里就结合WebSphere ... -
域名选择的那些事
2012-02-04 14:08 980自从打定主意要自 ... -
[转载]对session和cookie的一些理解
2012-02-03 16:24 769由于项目需要,最近用session容器比较多,传载的同 ... -
android: not find device
2012-02-02 14:14 752每次修改framework/base/core/... ... -
[转]PKCS12 证书的生成及验证
2012-02-02 13:29 4936http://blog.csdn.net/kmyhy/ ... -
Errors occurred during the build. Errors running builder 'JavaScript Validator'
2012-01-31 14:53 20599<p>在myeclipse自动编译的时候, ... -
搜索maven依赖的网站推荐
2012-01-31 14:33 1083 &nb ... -
悲催的this悲催的new
2012-01-31 14:28 745今天才发现,原来我对this的理解竟然如此模糊,原来我 ... -
OracleOraDb10g_home1TNSListener服务启动后又停止了
2011-12-28 15:58 1668Oracle 启动报错:OracleOraDb10g_ ... -
No action instance for path /leftTreeMenu could be created
2011-12-28 12:33 1278<span style="font-f ... -
wp数据库方案
2011-12-21 15:49 1338----------->转帖: <div ... -
VS2008 环境中完美搭建 Qt 4.7.4 静态编译的调试与发布
2011-12-20 14:43 4600[size=18px;]为什么要在VS2008中使用 ... -
iOS开发之结合asp.net webservice实现文件上传下载
2011-12-19 15:09 3692iOS开发中会经常用到文件上传下载的功能,这篇文件将介 ... -
iOS开发之详解剪贴板
2011-12-19 14:33 1438在iOS中,可以使用剪贴板实现应用程序之中以及应用程序 ... -
C#编写最小化到系统托盘的Windows应用程序
2011-12-15 13:59 989</span></span>& ... -
MapXtreme2004代码 几个地图工具的使用(C#)
2011-12-15 11:29 716<p class="MsoNormal ... -
基于SVG技术实现WebGIS的基本功能(2)
2011-12-14 13:34 515<p class="MsoNorma ... -
攘外必先安内 稳定才能发展 员工也是上帝
2011-12-14 09:04 1007不少公司都有顾客满意度的调查。在年初时候设定一个目标, ... -
海水与火焰——领导眼中两种不同类型的员工
2011-12-13 09:54 948头一段时间,业务扩大,一个Team拆分成两个Team。 ... -
Java读取Word/Excel/PDF可以使用的第三方包
2011-12-13 09:24 1011读取Word文档: tm-extractors.jar ...
相关推荐
易语言源码合并多个Excel文件.rar
合并多个Excel文件可以将多个Excel文件合并。@易语言数据库源码学习。
易语言合并多个Excel文件源码,合并多个Excel文件,取字符代码
源代码,因为该工具还有一些问题没有解决,对于某些EXCEL文件读取出现...将多个EXCEL文件合并成一个文件。只支持.XLS扩展名的文件。 程序运行条件,需要安装Adobe AIR,可以到官网下载:http://get.adobe.com/cn/air/
这是用WPS Excel的JS宏写的文件合并工具,可以通过对话框选择文件,把选中的Excel表格进行合并。里面包含xlsm启用宏的工作簿(js源码)和4个示例的Excel表格文件,下载不需要积分。
合并多个Excel文件
合并多个Excel文件.zip易语言项目例子源码下载合并多个Excel文件.zip易语言项目例子源码下载 1.合个人学习技术做项目参考 2.适合学生做毕业设计参考 3.适合小团队开发项目参考
将多个子文件夹下的相同名字的excel文件合并成一个excel,可以直接运行。excel见下面链接 https://amaze.blog.csdn.net/article/details/124889377?spm=1001.2014.3001.5502
npoi实现excel中多个表格数据分别合并,excel数据导入导出,项目源码
NULL 博文链接:https://a6985600.iteye.com/blog/1673991
用python合并多个excel的数据到一个表格里,Python源码
批量整理多个Excel文件中的工作表结构,如合并单元格、调整行高和列宽等。批量生成多个Excel文件中的汇总报告,如计算总和、平均值等。优势:节省时间:相比于手动逐个修改Excel文件,使用这个工具可以大大提高工作...
Excel的多个Sheet对应页面的多个Tab选项卡。 转换算法的难点在于,如何处理行列合并,将Excel的行列合并模型转换成Html表格的行列合并模型。 背景故事 因实际需要,需要将Excel展现在Web界面中。 最初,想在网上找...
能够批量将多个Excel文件进行合并,同时保持行头唯一。同时已完成封装,拥有直观的操作界面,可支持输出文件名称自命名,和另存为路径,
合并多个Excel文件可以将多个Excel文件合并。
本篇介绍的Python源码旨在实现一个常见但耗时的任务:批量合并一个工作簿中的多个表格。该源码使用Python的pandas库,这是一个强大的数据分析工具,它允许用户以高效的方式读取、处理和写入各种格式的数据,包括...
合并多个Excel文件
可以将多个excel文件合并到一个excel文件中,非常好用,欢迎学习
2 merge2excel 合并多个Excel到一个Excel的不同sheet中 3 sheet2excel 同一个excel里的不同sheet,拆分为不同的excel文件 4 find_excel_data 根据内容查询Excel 5 excel2pdf Excel转PDF 6 query4excel 把100个...