`

大数据导出Excel

    博客分类:
  • Java
 
阅读更多

这个在网上找到的一个例子,记录下来。

package com.zskx.pem.standalone.commons;


import java.io.IOException;
import java.io.Writer;
import java.util.Calendar;

import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.util.CellReference;


public class SpreadsheetWriter {
	
	private final Writer _out;
    private int _rownum;

    public SpreadsheetWriter(Writer out){
        _out = out;
    }

    public void beginSheet() throws IOException {
        _out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
                "<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">" );
        _out.write("<sheetData>\n");
    }

    public void endSheet() throws IOException {
        _out.write("</sheetData>");
        _out.write("</worksheet>");
    }

    /**
     * Insert a new row
     *
     * @param rownum 0-based row number
     */
        public void insertRow(int rownum) throws IOException {
        _out.write("<row r=\""+(rownum+1)+"\">\n");
        this._rownum = rownum;
    }

    /**
     * Insert row end marker
     */
        public void endRow() throws IOException {
        _out.write("</row>\n");
    }

    public void createCell(int columnIndex, String value, int styleIndex) throws IOException {
        String ref = new CellReference(_rownum, columnIndex).formatAsString();
        _out.write("<c r=\""+ref+"\" t=\"inlineStr\"");
        if(styleIndex != -1) _out.write(" s=\""+styleIndex+"\"");
        _out.write(">");
        _out.write("<is><t>"+value+"</t></is>");
        _out.write("</c>");
    }

    public void createCell(int columnIndex, String value) throws IOException {
        createCell(columnIndex, value, -1);
    }

    public void createCell(int columnIndex, double value, int styleIndex) throws IOException {
        String ref = new CellReference(_rownum, columnIndex).formatAsString();
        _out.write("<c r=\""+ref+"\" t=\"n\"");
        if(styleIndex != -1) _out.write(" s=\""+styleIndex+"\"");
        _out.write(">");
        _out.write("<v>"+value+"</v>");
        _out.write("</c>");
    }

    public void createCell(int columnIndex, double value) throws IOException {
        createCell(columnIndex, value, -1);
    }

    public void createCell(int columnIndex, Calendar value, int styleIndex) throws IOException {
        createCell(columnIndex, DateUtil.getExcelDate(value, false), styleIndex);
    }
}
	

 
package com.zskx.pem.standalone.commons;


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

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

public class ExcelUtil {

	private HSSFWorkbook wb = null;

	private HSSFSheet sheet = null;

	private HSSFRow row = null;

	private int sheetNum = 0;

	private int rowNum = 0;

	private FileInputStream fis = null;

	private File file = null;

	public ExcelUtil() {
	}

	public ExcelUtil(File file) {
		this.file = file;
	}

	public void setRowNum(int rowNum) {
		this.rowNum = rowNum;
	}

	public void setSheetNum(int sheetNum) {
		this.sheetNum = sheetNum;
	}

	public void setFile(File file) {
		this.file = file;
	}

	/**
	 * 读取excel文件获得HSSFWorkbook对象
	 */
	public void open() throws IOException {
		fis = new FileInputStream(file);
		wb = new HSSFWorkbook(new POIFSFileSystem(fis));
		fis.close();
	}

	/**
	 * 返回sheet表数目
	 */
	public int getSheetCount() {
		int sheetCount = -1;
		sheetCount = wb.getNumberOfSheets();
		return sheetCount;
	}

	/**
	 * sheetNum下的记录行数
	 */
	public int getRowCount() {
		if (wb == null)
			System.out.println("=============>WorkBook为空");
		HSSFSheet sheet = wb.getSheetAt(this.sheetNum);
		int rowCount = -1;
		rowCount = sheet.getLastRowNum();
		return rowCount;
	}

	/**
	 * 读取指定sheetNum的rowCount
	 */
	public int getRowCount(int sheetNum) {
		HSSFSheet sheet = wb.getSheetAt(sheetNum);
		int rowCount = -1;
		rowCount = sheet.getLastRowNum();
		return rowCount;
	}

	/**
	 * 得到指定行的内容
	 */
	public String[] readExcelLine(int lineNum) {
		return readExcelLine(this.sheetNum, lineNum);
	}

	/**
	 * 指定工作表和行数的内容
	 */
	public String[] readExcelLine(int sheetNum, int lineNum) {
		if (sheetNum < 0 || lineNum < 0)
			return null;
		String[] strExcelLine = null;
		try {
			sheet = wb.getSheetAt(sheetNum);
			row = sheet.getRow(lineNum);
			int cellCount = row.getLastCellNum();
			strExcelLine = new String[cellCount + 1];
			for (int i = 0; i <= cellCount; i++) {
				strExcelLine[i] = readStringExcelCell(lineNum, i);
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return strExcelLine;
	}

	/**
	 * 读取指定列的内容
	 */
	public String readStringExcelCell(int cellNum) {
		return readStringExcelCell(this.rowNum, cellNum);
	}

	/**
	 * 指定行和列编号的内容
	 */
	public String readStringExcelCell(int rowNum, int cellNum) {
		return readStringExcelCell(this.sheetNum, rowNum, cellNum);
	}

	/**
	 * 指定工作表、行、列下的内容
	 */
	public String readStringExcelCell(int sheetNum, int rowNum, int cellNum) {
		if (sheetNum < 0 || rowNum < 0)
			return "";
		String strExcelCell = "";
		try {
			sheet = wb.getSheetAt(sheetNum);
			row = sheet.getRow(rowNum);
			if (row.getCell((short) cellNum) != null) {
				switch (row.getCell((short) cellNum).getCellType()) {
				case HSSFCell.CELL_TYPE_FORMULA:
					strExcelCell = "FORMULA ";
					break;
				case HSSFCell.CELL_TYPE_NUMERIC:
					strExcelCell = String.valueOf(row.getCell((short) cellNum).getNumericCellValue());
					break;
				case HSSFCell.CELL_TYPE_STRING:
					strExcelCell = row.getCell((short) cellNum).getStringCellValue();
					break;
				case HSSFCell.CELL_TYPE_BLANK:
					strExcelCell = "";
					break;
				default:
					strExcelCell = "";
					break;
				}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return strExcelCell;
	}

	/**
	 * 主函数用于测试
	 */
	public static void main(String args[]) {
		try {
			File file = new File("/usr/test/users.xlsx");
			ExcelUtil readExcel = new ExcelUtil(file);
			try {
				readExcel.open();
			} catch (IOException e) {
				e.printStackTrace();
			}
			readExcel.setSheetNum(0);
			int count = readExcel.getRowCount();
			for (int i = 0; i <= count; i++) {
				String[] rows = readExcel.readExcelLine(i);
				for (int j = 0; j < rows.length; j++) {
					System.out.print(rows[j] + " ");
				}
				System.out.print("\n");
			}
		} catch (Exception e) {
			System.out.println("对不起,读取出错...");
		}
	}
}

 

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Writer;
import java.util.Calendar;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;

import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class BigGridDemo {

	private static final String[] headers = { "姓名", "职称", "职务", "专业方向", "国家", "省市", "单位", "科室", "通信地址", "邮编", "单位电话",
			"传真", "手机", "电子邮箱", "角色", "备注" };

	private static final String[] fields = { "name", "professionalTitle", "duties", "specialty", "country", "province",
			"unit", "section", "addeess", "postCode", "unitPhone", "fax", "mobilePhone", "email", "userInfoRoles",
			"mark" };

	public static void main(String[] args) throws Exception {

		// Step 1. Create a template file. Setup sheets and workbook-level
		// objects such as
		// cell styles, number formats, etc.

		XSSFWorkbook wb = new XSSFWorkbook();
		XSSFSheet sheet = wb.createSheet("Big Grid");

		// name of the zip entry holding sheet data, e.g.
		// /xl/worksheets/sheet1.xml
		String sheetRef = sheet.getPackagePart().getPartName().getName();

		// save the template
		FileOutputStream os = new FileOutputStream("template.xlsx");
		wb.write(os);
		os.close();

		// Step 2. Generate XML file.
		File tmp = File.createTempFile("sheet", ".xml");
		Writer fw = new FileWriter(tmp);
		fw.close();

		// Step 3. Substitute the template entry with the generated data
		FileOutputStream out = new FileOutputStream("big-grid.xlsx");
		substitute(new File("template.xlsx"), tmp, sheetRef.substring(1), out);
		out.close();
	}

	private static void generate(Writer out, Map<String, XSSFCellStyle> styles) throws Exception {

		Random rnd = new Random();
		Calendar calendar = Calendar.getInstance();

		SpreadsheetWriter sw = new SpreadsheetWriter(out);
		sw.beginSheet();

		// insert header row
		sw.insertRow(0);
		for (int i = 0; i < headers.length; i++) {
			sw.createCell(i, headers[i]);
		}
		sw.endRow();
		// write data rows
		for (int i = 1; i < 100000; i++) {
			sw.insertRow(i);
			sw.createCell(0, "name" + i);
			sw.createCell(1, "主任医师");
			sw.createCell(2, "职务" + i);
			if (i % 2 == 0)
				sw.createCell(3, "大厨");
			sw.createCell(3, "大厨@二厨");
			sw.createCell(4, "境内");
			sw.createCell(5, "西安");
			sw.createCell(6, "中盛剀欣");
			sw.createCell(7, "开发");
			sw.createCell(8, "科技二路");
			sw.createCell(9, "110");
			sw.createCell(10, "710000");
			sw.createCell(11, "120");
			sw.createCell(12, "130");
			sw.createCell(13, "140");
			sw.createCell(14, "150@163.com");
			sw.createCell(15, "编辑");

			sw.endRow();

			calendar.roll(Calendar.DAY_OF_YEAR, 1);
		}
		sw.endSheet();
	}

	private static void substitute(File zipfile, File tmpfile, String entry, OutputStream out) throws IOException {

		ZipFile zip = new ZipFile(zipfile);

		ZipOutputStream zos = new ZipOutputStream(out);

		@SuppressWarnings("unchecked")
		Enumeration<ZipEntry> en = (Enumeration<ZipEntry>) zip.entries();
		while (en.hasMoreElements()) {
			ZipEntry ze = en.nextElement();
			if (!ze.getName().equals(entry)) {
				zos.putNextEntry(new ZipEntry(ze.getName()));
				InputStream is = zip.getInputStream(ze);
				copyStream(is, zos);
				is.close();
			}
		}
		zos.putNextEntry(new ZipEntry(entry));
		InputStream is = new FileInputStream(tmpfile);
		copyStream(is, zos);
		is.close();

		zos.close();
	}

	private static void copyStream(InputStream in, OutputStream out) throws IOException {

		byte[] chunk = new byte[1024];
		int count;
		while ((count = in.read(chunk)) >= 0) {
			out.write(chunk, 0, count);
		}
	}

}
分享到:
评论

相关推荐

    poi多线程大数据导出excel文件.zip

    本项目“poi多线程大数据导出excel文件”提供了一个解决方案,利用多线程来提高Excel的大数据导出效率。 Apache POI 3.1版本是较早的版本,而项目中使用了更新的4.1版本,这意味着它可能利用了更多优化和新特性。在...

    大数据导出excel 和使用说明

    在IT行业中,大数据处理是一项关键任务,而将大数据导出为Excel格式是常见的需求,尤其在数据分析、报表生成和业务报告中。Java POI库是一个非常实用的工具,它允许开发者在Java应用中读写Microsoft Office格式的...

    C# 大数据 Excel导出

    在C#编程环境中,处理大数据并将其导出到Excel文件是一项常见的任务,特别是在数据分析、报表生成和数据交换的场景中。本主题将深入探讨如何在C#中有效地实现这一功能,确保性能和效率。 首先,要进行大数据Excel...

    C# 大数据量快速导出到 Excel方法

    总结来说,优化C#导出大数据到Excel的方法主要包括分批处理、禁用不必要的功能、批量写入、利用模板和使用第三方库等。通过这些方式,可以在保证数据完整性的前提下,显著提升导出效率,满足大数据量的导出需求。

    大数据导出要excel

    用2003导出大量数据时会报数据异常,原因是2003...现在2007-2013是可以处理大数据的,但是有时会出现内存溢出的情况,因为数据过多,内存被写满了,所以内存溢出。本案例亲测可以导出280W以上,只要磁盘够大就可以导出

    delphi高效率导出数据到excel

    Delphi 高效率导出数据到 Excel Delphi 是一个功能强大的开发工具,可以用于开发各种类型的应用程序,而 Excel 是一个非常popular的电子表格软件,经常用于数据分析和处理。在实际开发中,我们经常需要将数据从 ...

    数据库大量数据导出Excel

    POI3.8版本之前的版本处理大量数据的导出Excel效果不是很理想,主要在与Excel2003版本单个Sheet的行限制为65536,大量数据的导出得分多个Sheet,针对这一点,客户就不会满意。其次,在实验过程中,大数据量的导出很...

    Powerbuilder,PB自制大数据导出,超6w限制

    Powerbuilder,PB自制大数据导出,超6w限制,Powerbuilder,PB自制大数据导出,超6w限制,Powerbuilder,PB自制大数据导出,超6w限制,Powerbuilder,PB自制大数据导出,超6w限制,Powerbuilder,PB自制大数据导出,...

    poi导出excel支持xls、xlsx格式大数据导出java工具类

    使用poi导出excel支持xls、xlsx格式大数据导出java工具类,支持同一个单元格不同文本格式。找了好久,加上自己修改后,调试通过,发布出来分享,(调整student类位置)包含所需jar包,工具类,使用示例

    java解决大批量数据导出Excel产生内存溢出的方案

    - 尽管.xlsx格式需要更大的磁盘空间,但其内存效率远高于.xls格式,适合大数据导出。 4. **设置内存参数**: - 调整JVM的堆内存大小。可以通过增加`-Xms`和`-Xmx`参数来设置初始和最大堆内存,但这种方法只是治标...

    大数据快速导出EXCEL-Java

    本篇文章将详细探讨如何利用Java在内存消耗极低的情况下,快速导出百万级大数据到Excel文件。 首先,我们要理解大数据的特点:数据量大、类型多样、处理速度快。在导出大数据到Excel时,我们不能简单地一次性加载...

    jxl实现excel大数据导出

    jxl实现excel大数据导出,26000条记录,测试导出时间是19s,例子不算复杂,没有excel样式的处理,可以自己扩展哈,有数据库文件,部署即可看到效果!!! 有三个功能:代码构建数据的导出、数据库数据的导出(从配置...

    javaExcel大数据导出

    在Java开发中,处理大数据导出到Excel是一个常见的需求,特别是在数据分析、报表生成以及数据交换等场景。"javaExcel大数据导出"这个话题涉及到的主要知识点包括:Java与Excel的交互、大数据处理策略、性能优化以及...

    easyExcel实现大数据导出

    下面将详细阐述`easyExcel`的核心功能、使用方法以及如何实现大数据导出。 `easyExcel`的核心特性: 1. **内存优化**:`easyExcel`通过分片读写数据,避免一次性加载大量数据到内存中,从而减少内存占用。 2. **...

    javaExcel大数据导出.zip

    "javaExcel大数据导出.zip"这个压缩包可能包含了一个或多个示例项目,演示了如何在Java中高效地实现这一功能。下面我们将详细探讨相关的知识点。 1. **Apache POI库**: Apache POI是Java领域中广泛使用的库,它...

    超大xml解析导入数据库、千万级别大数据导出到Excel。实现核心:高性能、分段、分页循环:读取-写入-清空内存。解.zip

    标题提到的"超大XML解析导入数据库"和"千万级别大数据导出到Excel"涉及到两个关键的技术领域:大数据处理和高效数据转换。以下将详细探讨这两个方面的核心实现策略。 首先,对于超大XML文件的解析,XML是一种广泛...

    VC导出大数据到EXCEL解决方案

    在将大数据导出到Excel时,我们可以利用`COleSafeArray`来构建一个二维数组,存储要写入的数据,然后通过`Range`对象的`Value`属性将这个数组一次性写入Excel。 在设置表格部分,`nRows` 和 `nCols` 分别表示数据的...

    java导出100万以上excel大数据样例

    java导出excel大数据,由于excel本身sheet页存储条数的限制,方案一般有:1、导出多个excel,然后将多个excel压缩为zip包,导出;2、导出可以通过excel打开的文本文件;3、导出csv文件(简单格式的)。 本样例以导出...

    java 大数据导出csv小工具

    标题中的“java 大数据导出csv小工具”指的是一个基于Java编程语言开发的应用程序,其主要功能是将大量数据转换并导出为CSV(逗号分隔值)格式的文件。CSV是一种通用的文件格式,广泛用于数据交换,因为它可以被...

    poi2007导出excel大数据

    java操作poi2007导出excel数据,解决内存溢出问题

Global site tag (gtag.js) - Google Analytics