NPOI大数据分批写入同个Excel
实现过程:
要导出来的数据库数据量很大,一次取出来压力有点大,故分批取出来,导入到同一个Excel。
因为Excel2003版最大行数是65536行,Excel2007开始的版本最大行数是1048576行,故NPOI导出时候选择了Excel2007。
Form1.cs
/*
引用命名空间:
using System.IO;
using System.Threading.Tasks;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
*/ public Form1()
{
InitializeComponent();
List<DictionaryEntry> list = new List<DictionaryEntry>(){
new DictionaryEntry(1, "XA"),
new DictionaryEntry(2, "XB")
};
cbType.BindComboBox(list);
} private void CreateExcel(string fileName)
{
if (File.Exists(fileName))
File.Delete(fileName); IWorkbook workbook = new XSSFWorkbook();
ISheet sheet = workbook.CreateSheet("Sheet1");
FileStream sw = File.Create(fileName);
workbook.Write(sw);
sw.Close();
} private void btnExport_Click(object sender, EventArgs e)
{
try
{
Task.Factory.StartNew(() =>
{
txtSql.SafeCall(() =>
{
txtSql.AppendText("开始处理...\r\n");
}); BusinessType businessType = GetBusinessType();
string[] sqlWhereArray = Sql.SqlWhereArray;
string[] DateRemarkArray = Sql.DateRemarkArray;
string fileName = string.Format("{0}.xlsx", businessType.ToString()); CreateExcel(fileName); string sqlCount = Sql.GetRecordSql(businessType, "");
int recordCount = db.ExecuteScalar(sqlCount);
int sqlIndex = 0;
int rowIndex = 0;
foreach (string sqlWhre in sqlWhereArray)
{
sqlIndex++;
FileStream fs = File.Open(fileName, FileMode.Open);
IWorkbook workbook = new XSSFWorkbook(fs);
ISheet sheet = workbook.GetSheetAt(0);
txtSql.SafeCall(() =>
{
txtSql.AppendText("条件" + sqlIndex.ToString() + ":" + DateRemarkArray[sqlIndex - 1]);
});
string sql = Sql.GetDataSql(businessType, sqlWhre);
DataTable dt = db.GetDataSet(sql).Tables[0]; int columnsCount = dt.Columns.Count;
if (sqlIndex == 1)
{
IRow row0 = sheet.CreateRow(0);
for (int m = 0; m < columnsCount; m++)
{
DataColumn dc = dt.Columns[m];
row0.CreateCell(m).SetCellValue(dc.ColumnName);
}
} for (int i = 0; i < dt.Rows.Count; i++)
{
rowIndex++;
DataRow dr = dt.Rows[i];
IRow row = sheet.CreateRow(rowIndex);
for (int j = 0; j < columnsCount; j++)
{
row.CreateCell(j).SetCellValue(dr[j].ToString());
} lblMsg.SafeCall(() =>
{
if(i == (dt.Rows.Count - 1))
txtSql.AppendText(" 行数:" + (i+1).ToString() + "\r\n");
lblMsg.Text = string.Format("正在导出第{0}个条件,第{1}行", sqlIndex.ToString(), (i + 1).ToString());
double x = rowIndex * 1.0 / recordCount * 100;
lblProgress.Text = string.Format("总行数:{0}, 当前完成总{1}行,百分占比:{2} %", recordCount.ToString(), rowIndex.ToString(), x.ToString("#0.0"));
});
}
FileStream outFs = new FileStream(fileName, FileMode.Open);
workbook.Write(outFs);
outFs.Close();
}
}).ContinueWith(TaskEnded);
}
catch (Exception ex)
{
MessageBox.Show("发生异常,错误提示:" + ex.Message);
}
}
private void TaskEnded(Task task)
{
txtSql.SafeCall(() =>
{
lblMsg.Text = "全部导出完成!";
txtSql.AppendText("处理完成!\r\n");
});
}
Extensions.cs
public static class Extensions
{
public static void SafeCall(this Control ctrl, Action callback)
{
if (ctrl.InvokeRequired)
ctrl.Invoke(callback);
else
callback();
}
public static void BindComboBox(this ComboBox cb, List<DictionaryEntry> list)
{
cb.DisplayMember = "Value";
cb.ValueMember = "Key";
cb.DataSource = list;
}
}
Sql.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace DataExport
{
public enum BusinessType
{
XA = 1,
XB = 2
} public class Sql
{
/// <summary>
/// 分批获取sql的where条件
/// </summary>
public static string[] SqlWhereArray = {
" 条件1 ",
" 条件2 ",
" 条件3 "
}; /// <summary>
/// sql的where条件说明
/// </summary>
public static string[] DateRemarkArray = {
"20130101至20130331",
"20130401至20130630",
"20130701后",
}; /// <summary>
/// 获取sql语句
/// </summary>
/// <param name="type"></param>
/// <param name="columns"></param>
/// <param name="sqlWhere"></param>
/// <returns></returns>
private static string GetSql(BusinessType type, string columns, string sqlWhere)
{
string sql = "";
switch (type)
{
case BusinessType.XA:
sql = string.Format(@"SELECT {0} FROMM tb1 WHERE 1=1 {1} ", columns, sqlWhere);
break;
case BusinessType.XB:
sql = string.Format(@"SELECT {0} FROMM tb2 WHERE 1=1 {1} ", columns, sqlWhere);
break;
} return sql;
} /// <summary>
/// 获取总记录数
/// </summary>
/// <param name="type"></param>
/// <param name="sqlWhere"></param>
/// <returns></returns>
public static string GetRecordSql(BusinessType type, string sqlWhere)
{
string columns = "count(*)";
return GetSql(type, columns, sqlWhere);
} /// <summary>
/// 获取数据
/// </summary>
/// <param name="type"></param>
/// <param name="sqlWhere"></param>
/// <returns></returns>
public static string GetDataSql(BusinessType type, string sqlWhere)
{
string columns = "";
switch (type)
{
case BusinessType.XA:
columns = @"
col1 列1,
col2 列2,
col3 列3
";
break;
case BusinessType.XB:
columns = @"
col1 列1,
col2 列2
";
break; }
return GetSql(type, columns, sqlWhere);
}
}
}
NPOI大数据分批写入同个Excel的更多相关文章
- NPOI利用多任务模式分批写入多个Excel
接上文NPOI大数据分批写入同个Excel,这次是利用task多任务同时写入到多个Excel. Form2.cs private void btnExport_Click(object sender, ...
- NPOI大数据量多个sheet导出源码(原)
代码如下: #region NPOI大数据量多个sheet导出 /// <summary> /// 大数据量多个sheet导出 /// </summary> /// <t ...
- 有效提升大数据量写入excel的效率
在开发过程中经常会有需要将数据导出到 excel 的需求,当数据量很大,达到几万甚至几十万.几百万级别的时候,如何加快生成 excel 的速度呢?首先普及一下知识背景:Excel2003 及以下版本一 ...
- 大数据导入Excel
在平时的项目中,将数据导出到Excel的需求是很常见的,在此对一些常见的方法做以总结,并提供一种大数据量导出的实现. OLEDB 使用OLEDB可以很方便导出Excel,思路很简单,处理时将Exc ...
- NPOI导出数据到Excel
NPOI导出数据到Excel 前言 Asp.net操作Excel已经是老生长谈的事情了,可下面我说的这个NPOI操作Excel,应该是最好的方案了,没有之一,使用NPOI能够帮助开发者在没有安装微 ...
- java 导出Excel 大数据量,自己经验总结!
出处: http://lyjilu.iteye.com/ 分析导出实现代码,XLSX支持: /** * 生成<span style="white-space: normal; back ...
- C#通过OLEDB导出大数据到Excel
C#导出数据到Excel,基本有两种方法,一种方法是通过Microsoft.Office.Interop.Excel.Application,一行一列的写入Excel中:另一种方法是通过OLEDB,利 ...
- POI读写大数据量excel,解决超过几万行而导致内存溢出的问题
1. Excel2003与Excel2007 两个版本的最大行数和列数不同,2003版最大行数是65536行,最大列数是256列,2007版及以后的版本最大行数是1048576行,最大列数是16384 ...
- npoi实现数据导出Excel
npoi .NET第三方的Office功能组件. 链接地址 http://npoi.codeplex.com/ 引用命名空间 using NPOI.HSSF.UserModel; using ...
随机推荐
- [置顶] 一个懦弱的IT人
对自己近来的学习和工作做一个总结,规划一下未来. 还是从大三暑假说起,稀里糊涂的被拉去参加电子设计大赛,熬过了一段痛苦的时间.原本我是学计算机的,对硬件不太熟悉.不过经过一段时间痛苦的断断续续的学习, ...
- django view使用学习记录
判断用户是否登录 request.user.is_authenticated()auth.authenticate(username=username, password=password)
- 安装新版xampp后apache无法启动提示:Apache Service detected with wrong path解决方案
我以前安装过xampp,因为学习thingPHP需要升级PHP5.0以上,所以我就卸掉了xampp,从新安装新版本的xampp其中PHP是最新版的,但是安装后启动xampp提示如下:Apache Se ...
- 编码-截取中文-去除HTML字符
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> < ...
- POJ 3580:SuperMemo(Splay)
http://poj.org/problem?id=3580 题意:有6种操作,其中有两种之前没做过,就是Revolve操作和Min操作.Revolve一开始想着一个一个删一个一个插,觉得太暴力了,后 ...
- 系统图片uri的问题
调用系统图库会出现两种uri的问题,一个是在文件管理器中的图库中,获取到的地址为:content://media/external/images/media/972 这种格式 另外一种的是系统文件管 ...
- android异步加载图片并缓存到本地实现方法
图片过多造成内存溢出,这个是最不容易解决的,要想一些好的缓存策略,比如大图片使用LRU缓存策略或懒加载缓存策略.今天首先介绍一下本地缓存图片 在android项目中访问网络图片是非常普遍性的事 ...
- BLOB:大数据,大对象,在数据库中用来存储超长文本的数据,例如图片等
将一张图片存储在mysql中,并读取出来(BLOB数据:插入BLOB类型的数据必须使用PreparedStatement,因为插入BLOB类型的数据无法使用字符串拼写): -------------- ...
- 转载-python学习笔记之输入输出功能读取和写入数据
读取.写入和 Python 在 “探索 Python” 系列以前的文章中,学习了基本的 Python 数据类型和一些容器数据类型,例如tuple.string 和 list.其他文章讨论了 Pytho ...
- JAVA基础知识之IO——Java IO体系及常用类
Java IO体系 个人觉得可以用"字节流操作类和字符流操作类组成了Java IO体系"来高度概括Java IO体系. 借用几张网络图片来说明(图片来自 http://blog.c ...