`
fei78945678
  • 浏览: 14831 次
  • 性别: 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就行。

    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应用程序中读取、...

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

    基于SpringBoot、JDBC、Mybatis和EasyExcel的Java Excel批量导入导出设计源码,是一款针对高效处理Excel数据的Java应用解决方案。该项目充分利用了SpringBoot框架的便捷性和Mybatis持久层技术的强大功能,结合...

    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