`
fei78945678
  • 浏览: 14679 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
阅读更多
package myTest.com;

import java.io.ByteArrayInputStream;
import java.io.FileInputStream;
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.poi.hssf.model.Sheet;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.CellValueRecordInterface;
import org.apache.poi.hssf.record.DimensionsRecord;
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.RecordFactory;
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;

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 main(String[] args) 
	{
		List<String> filepaht=new ArrayList<String>();
		filepaht.add("F:\\test1.xls");
		filepaht.add("F:\\test2.xls");
		filepaht.add("F:\\test3.xls");
		filepaht.add("F:\\test4.xls");
		filepaht.add("F:\\test5.xls");
		try {
			merge(filepaht,"F:\\test_aLL.xls");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	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;
	}

}










///

package myTest.com;

/**
 * 大数据量导出成EXCEL或XML
 * @author J.W
 * 2011-06-08
 */
import java.io.BufferedOutputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyOfTest {
	public static void main(String[] args) {
		StringBuffer sb = new StringBuffer();
		try {
			DataOutputStream rafs = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(new File("d://test.xml"))));
			sb.append("<?xml version=\"1.0\" encoding=\"GBK\" ?>");
			sb.append("\n");
			sb.append("<?mso-application progid=\"Excel.Sheet\"?>");
			sb.append("\n");
			sb.append("<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\"");
			sb.append("\n");
			sb.append("xmlns:o=\"urn:schemas-microsoft-com:office:office\"");
			sb.append("\n");
			sb.append("xmlns:x=\"urn:schemas-microsoft-com:office:excel\"");
			sb.append("\n");
			sb.append("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\"");
			sb.append("\n");
			sb.append("xmlns:html=\"http://www.w3.org/TR/REC-html40\">");
			sb.append("\n");
			sb.append("<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">");
			sb.append("\n");
			sb.append("<Version>11.9999</Version>");
			sb.append("\n");
			sb.append("</DocumentProperties>");
			sb.append("\n");
			sb.append("<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">");
			sb.append("\n");
			sb.append("<WindowHeight>10005</WindowHeight>").append("\n");
			sb.append("<WindowWidth>10005</WindowWidth>");
			sb.append("\n");
			sb.append("<WindowTopX>120</WindowTopX>");
			sb.append("\n");
			 sb.append("<WindowTopY>135</WindowTopY>").append("\n");
			 sb.append("<ActiveSheet>1</ActiveSheet>").append("\n");
			 sb.append("<ProtectStructure>False</ProtectStructure>").append("\n");
			 sb.append("<ProtectWindows>False</ProtectWindows>").append("\n");
			 sb.append("</ExcelWorkbook>").append("\n");
			 sb.append("<Styles>").append("\n");
			 sb.append("<Style ss:ID=\"Default\" ss:Name=\"Normal\">").append("\n");
			 sb.append("<Alignment ss:Vertical=\"Center\"/>").append("\n");
			 sb.append("<Borders/>").append("\n");
			 sb.append("<Font ss:FontName=\"??ì?\" x:CharSet=\"134\" ss:Size=\"12\"/>").append("\n");
			 sb.append("<Interior/>").append("\n");
			 sb.append("<NumberFormat/>").append("\n");
			 sb.append("<Protection/>").append("\n");
			 sb.append("</Style>").append("\n");
			 sb.append("<Style ss:ID=\"s23\">").append("\n");
			 sb.append("<Font ss:FontName=\"??ì?\" x:CharSet=\"134\" ss:Size=\"12\" ss:Color=\"#0000FF\"").append("\n");
			 sb.append("ss:Bold=\"1\"/>").append("\n");
			 sb.append("<Interior ss:Color=\"#C0C0C0\" ss:Pattern=\"Solid\"/>").append("\n");
			 sb.append("</Style>").append("\n");
			 sb.append("</Styles>").append("\n");
			 sb.append("\n");
			int sheetcount = 0;
			int recordcount = 2;
			int currentRecord = 0;
			int total = 2;
			int col = 10;
		
			for (int i = 0; i < total; i++) {
			if (i == 0) {// 一个sheet写满

//					sb.append("\n");
				sb.append("<Worksheet ss:Name=\"Sheet2\">").append("\n");
				sb.append("<Table ss:ExpandedColumnCount=\""+col+"\" ss:ExpandedRowCount=\""+total+"\" x:FullColumns=\"1\"").append("\n");
				sb.append("x:FullRows=\"1\" ss:DefaultColumnWidth=\"54\" ss:DefaultRowHeight=\"14.25\">").append("\n");
				sb.append("<Column ss:AutoFitWidth=\"0\" ss:Width=\"73.5\"/>").append("\n");
				sb.append("<Column ss:AutoFitWidth=\"0\" ss:Width=\"119.25\"/>").append("\n");
				sb.append("<Column ss:AutoFitWidth=\"0\" ss:Width=\"89.25\"/>").append("\n");
				sb.append("<Column ss:AutoFitWidth=\"0\" ss:Width=\"141\"/>").append("\n");
			}
				
				sb.append("<Row ss:AutoFitHeight=\"0\">");
				sb.append("\n");
				
				for (int j = 0; j < col; j++) 
				{
				
						sb.append("<Cell ><Data ss:Type=\"String\">"+"aaa打算"+"</Data></Cell>");

					sb.append("\n");
					System.out.println(i);
					
				}
				sb.append("</Row>");
				if (i % 5000 == 0) {
					rafs.write(sb.toString().getBytes());
					rafs.flush();
					sb.setLength(0);
				}
				sb.append("\n");
				currentRecord++;
			}
			rafs.write(sb.toString().getBytes());
			sb.setLength(0);
			sb.append("</Table>").append("\n");
			sb.append("<WorksheetOptions xmlns=\"urn:schemas-microsoft-com:office:excel\">").append("\n");
			sb.append("<Print>").append("\n");
			sb.append("<ValidPrinterInfo/>").append("\n");
			sb.append("<PaperSizeIndex>9</PaperSizeIndex>").append("\n");
			sb.append("<HorizontalResolution>600</HorizontalResolution>").append("\n");
			sb.append("<VerticalResolution>600</VerticalResolution>").append("\n");
			sb.append("</Print>").append("\n");
			sb.append("<Selected/>").append("\n");
		
			sb.append("<ProtectObjects>False</ProtectObjects>").append("\n");
			sb.append("<ProtectScenarios>False</ProtectScenarios>").append("\n");
			sb.append("</WorksheetOptions>").append("\n");
			sb.append("</Worksheet>").append("\n");
			sb.append("</Workbook>");
			rafs.write(sb.toString().getBytes());
			rafs.flush();
			rafs.close();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}
分享到:
评论

相关推荐

    java excel转html

    Java提供了多种库来实现这样的功能,这些库通常能够处理不同版本的Excel文件,包括32位和64位系统上的文件。 首先,我们需要了解Java中的主要库,如Apache POI和JExcelAPI,它们是用于读取和操作Excel文件的流行...

    Java Excel Api及详细教程

    Java Excel API是一个强大的工具,允许Java开发者方便地读取、写入和操作Microsoft Excel文件。在Eclipse这样的集成开发环境中,使用Java Excel API可以轻松处理各种Excel数据操作任务。本教程将详细介绍如何在...

    javaEXCEL

    JavaExcel是一个广泛使用的术语,指的是使用Java处理Excel文件的相关技术,特别是Apache POI库。Apache POI是一个开源项目,允许Java开发者读取、写入和修改Microsoft Office格式的文件,其中包括Excel(.xlsx和.xls...

    Java Excel比较代码 poi

    Java Excel比较代码主要涉及到的是Apache POI库的使用,这是一个强大的API,允许Java开发者读取、写入和修改Microsoft Office格式的文件,包括Excel。在本项目中,它被用来对比两个Excel工作表中的数据差异。 ...

    JavaExcel

    JavaExcel是一个纯Java实现的Excel操作组件,它允许开发者在Java应用程序中轻松地读取、创建和修改Excel文件。这个组件通常被称为JExcelAPI,它提供了丰富的API接口,使得处理Excel数据变得简单而高效。JExcelAPI...

    java excel 生成6级级联

    java excel 生成6级级联。加一个poi.jar就行。

    基于SpringBoot、JDBC、Mybatis和EasyExcel的Java Excel批量导入导出设计源码

    该项目是一款基于SpringBoot、JDBC、Mybatis和EasyExcel的Java Excel批量导入导出解决方案源码,包含22个文件,其中包括10个Java源文件、2个Markdown文件、2个XML文件、1个Git忽略文件、1个JAR包文件、1个属性文件、...

    JAVA EXCEL API简介

    Java Excel API 是一个开源项目,专门用于在Java环境中处理Excel文件。这个API使得开发者无需依赖Windows操作系统,就能在任何平台上创建、读取和修改Excel文件。由于它是用Java编写的,因此非常适合在Web应用程序中...

    JAVA Excel API教程.pdf

    ### JAVA Excel API教程知识点概述 #### 一、Java Excel API简介 Java Excel API是一种用于处理Microsoft Excel文件(.xls和.xlsx格式)的强大工具。通过Java Excel API,开发人员能够轻松地在Java应用程序中读取、...

    java Excel导出导入

    java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入java Excel 导出 导入

    javaExcel大数据导出

    "javaExcel大数据导出"这个话题涉及到的主要知识点包括:Java与Excel的交互、大数据处理策略、性能优化以及内存管理。 1. **Java与Excel的交互**: Java可以通过多种库来实现与Excel的交互,如Apache POI、...

    java Excel相关处理 java Excel相关处理

    java Excel相关处理 java Excel相关处理java Excel相关处理 java Excel相关处理java Excel相关处理 java Excel相关处理java Excel相关处理 java Excel相关处理java Excel相关处理 java Excel相关处理java Excel相关...

    java Excel写入导出

    Java Excel写入与导出是Java开发者在处理数据时经常遇到的任务,特别是在数据分析、报表生成或者数据导入导出等场景。这项技术主要依赖于Apache POI库,它是一个开源项目,提供了读取、写入Microsoft Office格式文件...

    JavaExcel导出示例

    本示例主要关注如何使用Apache POI库来实现JavaExcel导出功能。Apache POI是一个开源项目,它提供了读取和写入Microsoft Office格式文件的能力,包括Excel。 首先,你需要在你的项目中引入Apache POI依赖。如果你...

    java excel api

    Java Excel API,通常指的是jxl库,是一个广泛使用的开源Java库,用于读写Microsoft Excel文件。这个库使得在Java程序中处理Excel数据变得极其便捷,无论是读取现有的工作簿、创建新的工作簿,还是修改现有表格,jxl...

    java Excel工具类与LIB

    Java Excel工具类与LIB指的是在Java编程环境中处理Excel文件的一系列方法和库。这些工具能够帮助开发者轻松地创建、读取、修改Excel文件,并且能够将Excel数据转换为Java对象,反之亦然。这里提到的"XLSUtils.java...

    java excel tree

    在Java编程领域,生成Excel报表是一项常见的任务,尤其在数据可视化和组织结构管理中。"java excel tree"这个主题正是关于如何使用Java来创建一个基于Excel的组织架构报表,它利用了组合模式和一系列算法来实现自动...

    免费Java Excel类库-Free Spire.XLS for Java-2.2.0

    Free Spire.XLS for Java是一款专门针对Java平台的开源Excel处理类库,它允许开发者在Java应用程序中创建、读取、修改和导出Excel文件。这个版本为2.2.0,提供了丰富的功能和易用的API,使得与Excel文件交互变得更加...

    JAVA Excel日历控件

    Java Excel日历控件是一种在Java应用程序中用于展示和交互日期选择的组件,它使得用户能够方便地在GUI(图形用户界面)中处理日期相关的任务。这种控件通常被集成到Java Swing或JavaFX框架中,以提供类似Excel中日历...

Global site tag (gtag.js) - Google Analytics