java POI技术之导出数据优化(15万条数据1分多钟)
专针对导出excel2007 ,用到poi3.9的jar
package com.cares.ynt.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.xssf.streaming.SXSSFCell;
import org.apache.poi.xssf.streaming.SXSSFRow;
import org.apache.poi.xssf.streaming.SXSSFSheet;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFDataFormat;
import org.apache.poi.xssf.usermodel.XSSFFont;
public class ExportData {
private XSSFCellStyle head_Style;
private SXSSFWorkbook workbook;
// 当前sheet
private SXSSFSheet sheet;
private SXSSFRow row = null;// 创建一行
private SXSSFCell cell = null;
private String headers[][];
private int currentRow = 0;
private XSSFCellStyle date_Style ;
private XSSFCellStyle time_Style ;
private XSSFCellStyle string_style;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
/**
* 构造函数初始化参数
* @param out
* @param title
* @param headers
* @param sheeatName
*/
public ExportData(String title,String[][] headers,String sheeatName){
this.headers = headers;
try{
workbook=new SXSSFWorkbook();
this.head_Style=(XSSFCellStyle) this.workbook.createCellStyle();
head_Style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
head_Style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
head_Style.setBorderRight(XSSFCellStyle.BORDER_THIN);
head_Style.setBorderTop(XSSFCellStyle.BORDER_THIN);
head_Style.setFillForegroundColor(IndexedColors.AQUA.getIndex());
head_Style.setFillPattern(CellStyle.SOLID_FOREGROUND);
head_Style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
XSSFFont head_font = (XSSFFont) workbook.createFont();
head_font.setFontName("宋体");// 设置头部字体为宋体
head_font.setBoldweight(Font.BOLDWEIGHT_BOLD); // 粗体
head_font.setFontHeightInPoints((short) 11);
this.head_Style.setFont(head_font);// 单元格样式使用字体
XSSFDataFormat format = (XSSFDataFormat) workbook.createDataFormat();
XSSFFont data_font = (XSSFFont) workbook.createFont();
data_font.setFontName("宋体");// 设置头部字体为宋体
data_font.setFontHeightInPoints((short) 10);
this.date_Style = (XSSFCellStyle) this.workbook.createCellStyle();
date_Style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
date_Style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
date_Style.setBorderRight(XSSFCellStyle.BORDER_THIN);
date_Style.setBorderTop(XSSFCellStyle.BORDER_THIN);
date_Style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
date_Style.setFont(data_font);// 单元格样式使用字体
date_Style.setDataFormat(format.getFormat("yyyy-m-d"));
this.time_Style = (XSSFCellStyle) this.workbook.createCellStyle();
time_Style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
time_Style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
time_Style.setBorderRight(XSSFCellStyle.BORDER_THIN);
time_Style.setBorderTop(XSSFCellStyle.BORDER_THIN);
time_Style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
time_Style.setFont(data_font);// 单元格样式使用字体
time_Style.setDataFormat(format.getFormat("yyyy-m-d h:mm:s"));
this.string_style = (XSSFCellStyle) this.workbook.createCellStyle();
string_style.setBorderBottom(XSSFCellStyle.BORDER_THIN);
string_style.setBorderLeft(XSSFCellStyle.BORDER_THIN);
string_style.setBorderRight(XSSFCellStyle.BORDER_THIN);
string_style.setBorderTop(XSSFCellStyle.BORDER_THIN);
string_style.setAlignment(XSSFCellStyle.ALIGN_CENTER);
string_style.setFont(data_font);// 单元格样式使用字体
createSheet( sheeatName,headers);
}catch(Exception exc)
{
exc.printStackTrace();
}
}
/**
* 创建表头
* @param sheetName
* @param headers
*/
private void createSheet(String sheetName,String headers[][]) {
sheet = (SXSSFSheet) workbook.createSheet(sheetName);
row = (SXSSFRow) sheet.createRow(currentRow);
for (int i = 0; i < headers.length; i++) {
cell = (SXSSFCell) row.createCell(i);
cell.setCellType(XSSFCell.CELL_TYPE_STRING);
cell.setCellValue(headers[i][0]);
cell.setCellStyle(head_Style);
}
currentRow++;
}
/**
* 导出excel
* @param listRows
* @throws ParseException
*/
public synchronized void PoiWriteExcel_To2007(List listRows,OutputStream out) throws ParseException {
for (int i = 0; i < listRows.size(); i++) {
row = (SXSSFRow) sheet.createRow(currentRow);
ArrayList ListCells = (ArrayList)listRows.get(i);
for (int j = 0; j < ListCells.size(); j++) {
Object obj = ListCells.get(j);
cell = (SXSSFCell) row.createCell(j);
if(obj instanceof Integer){
cell.setCellValue((String)obj);
cell.setCellStyle(string_style);
}else if(obj instanceof Date){
String type = headers[j][1];
if("DATE".equals(type)){
cell.setCellValue((Date)obj);
cell.setCellStyle(date_Style);
}else if("TIME".equals(type)){
cell.setCellValue((Date)obj);
cell.setCellStyle(time_Style);
}else{
if(!"".equals((String)obj))
cell.setCellValue(sdf.format((Date)obj));
cell.setCellValue("");
cell.setCellStyle(string_style);
}
}else{
if(!"".equals((String)obj))
cell.setCellValue((String)obj);
cell.setCellValue("");
cell.setCellStyle(string_style);
}
}
currentRow ++;
}
try {
workbook.write(out);
out.flush();
out.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 测试导出
* @param args
* @throws IOException
* @throws ParseException
*/
public static void main(String[] args) throws IOException, ParseException {
String headers[][] = {{"日期","DATE"},{"标题","TIME"},{"其他",null}} ;
File file = new File("D://test/michael/test.xlsx");
if (file.exists())
file.delete();
file.createNewFile();
ExportData exportData = new ExportData("test", headers, "test");
ArrayList<ArrayList<?>> data = new ArrayList<ArrayList<?>>();
for (int i = 0; i < 200000; i++) {
ArrayList<Date> cellList = new ArrayList<Date>();
for (int j = 0; j < 3; j++) {
cellList.add(new Date());
}
data.add(cellList);
}
OutputStream out = new FileOutputStream(file);
exportData.PoiWriteExcel_To2007(data,out);
}
}
java POI技术之导出数据优化(15万条数据1分多钟)的更多相关文章
- Java 线程池 +生产者消费者+MySQL读取300 万条数据
1.1需求 数据库300 万条用户数据 ,遍历获取所有用户, 各种组合关联, 获取到一个新的json ,存到redis 上. 1.2 难点 数据库比较多, 不可能单线程查询所有的数据到内存. 1.3解 ...
- [C#]_[使用微软OpenXmlSDK (OpenXmlReader)读取xlsx表格] 读取大数据量100万条数据Excel文件解决方案
1.OpenXmlSDK是个很好的类库,可惜只能通过C#调用,C#的童鞋又福气了. 2.服务端程序由于没法安装office,所以这个对asp.net网站来说是最理想的库了.需要.net 4.0版本 ...
- 1300多万条数据30G论坛大数据优化实战经验小结
最近由于某大型网站社区论坛运行效率比较低用户反馈论坛有些卡需要对系统进行优化,论坛性能影响了公司的形象还有网站的流量,当然这也会影响到公司的收入,而且后期还需要长期维护网站的社区论坛服务. 1:并发访 ...
- 性能优化:虚拟列表,如何渲染10万条数据的dom,页面同时不卡顿
列表大概有2万条数据,又不让做成分页,如果页面直接渲染2万条数据,在一些低配电脑上可能会照成页面卡死,基于这个需求,我们来手写一个虚拟列表 思路 列表中固定只显示少量的数据,比如60条 在列表滚动的时 ...
- 极限挑战—C#+ODP 100万条数据导入Oracle数据库仅用不到1秒
链接地址:http://www.cnblogs.com/armyfai/p/4646213.html 要:在这里我们将看到的是C#中利用ODP实现在Oracle数据库中瞬间导入百万级数据,这对快速批量 ...
- Mvc+Dapper+存储过程分页10万条数据
10万条数据采用存储过程分页实现(Mvc+Dapper+存储过程) 有时候大数据量进行查询操作的时候,查询速度很大强度上可以影响用户体验,因此自己简单写了一个demo,简单总结记录一下: 技术:Mvc ...
- 插入1000万条数据到mysql数据库表
转自:https://www.cnblogs.com/fanwencong/p/5765136.html 我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入100 ...
- EDG夺冠!用Python分析22.3万条数据:粉丝都疯了!
一.EDG夺冠信息 11月6日,在英雄联盟总决赛中,EDG战队以3:2战胜韩国队,获得2021年英雄联盟全球总决赛冠军,这个比赛在全网各大平台也是备受瞩目: 1.微博热搜第一名,截止2021-11-1 ...
- 绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来
我用到的数据库为,mysql数据库5.7版本的 1.首先自己准备好数据库表 其实我在插入1000万条数据的时候遇到了一些问题,现在先来解决他们,一开始我插入100万条数据时候报错,控制台的信息如下: ...
随机推荐
- SqlServer自定义数据类型
定义:用户自己设计并实现的数据类型就称为用户自定义数据类型,即使这些数据类型基于系统数据类型. 创建用户自定义数据类型时,必须提供三个数: 数据类型的名称 所基于的系统数据类型 数据类型的可空性(是否 ...
- XSL简单实例
利用xsl可以做到将数据和格式完全分离,下面比较一个xml+css和xml+xsl的区别. XML + css resume.xml文件内容如下: <?xml version="1.0 ...
- TP5之一次选择多张图片并预览
点击选择图片(可选多张),确定后将选择的图片显示在页面上,已经选择的图片也可以删除,点击提交将图片提交给后台. 1.效果图 2.code 用input标签并选择type=file,记得带上multip ...
- 检测到"_ITERATOR_DEBUG_LEVEL"的不匹配项
error: vtkCommon.lib(vtkSmartPointerBase.obj) : error LNK2038: 检测到“_ITERATOR_DEBUG_LEVEL”的不匹配项:值“0”不 ...
- 算法学习--Day10
今天开始了新一章的学习,前面的题目虽然做了几道,但是我觉得训练量仍然太小了.不过机试确实很多题目,并且难度也有所不同,所以要针对不同的题目进行专门的练习才好.题目类型有些多,等接下来我将搜索的题目写完 ...
- builtin_shaders-5.3.4f1学习-Sprites-Default
Shader "Sprites/Default" { Properties { [PerRendererData] _MainTex ("Sprite Texture&q ...
- 浅谈C++中内存泄漏的检测
首先我们需要知道程序有没有内存泄露,然后定位到底是哪行代码出现内存泄露了,这样才能将其修复.最简单的方法当然是借助于专业的检测工具,比较有名如BoundsCheck,功能非常强大,相信做C++开发的人 ...
- Codevs 1282 约瑟夫问题
1282 约瑟夫问题 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 大师 Master 题解 题目描述 Description 有编号从1到N的N个小朋友在玩一种 ...
- 全球首款iOS模拟器出炉!在违法的边缘疯狂试探
对于许多智能手机用户,特别是手游玩家来说,在手机屏幕的方寸之间进行操作显然并非特别方便,而且在多年之前,由于手机配置不足,也导致了用PC来玩手游的需求不断涌现.彼时,BlueStacks及夜神等一众A ...
- .Net Core应用框架Util介绍(二) 转
Util的开源地址 https://github.com/dotnetcore/util Util的开源协议 Util以MIT协议开源,这是目前最宽松的开源协议,你不仅可以用于商业项目,还能把Util ...