博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
NPOI大数据分批写入同个Excel
阅读量:2120 次
发布时间:2019-04-30

本文共 7134 字,大约阅读时间需要 23 分钟。

实现过程:
要导出来的数据库数据量很大,一次取出来压力有点大,故分批取出来,导入到同一个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
list = new List
(){ 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
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    {        ///         /// 分批获取sql的where条件        ///         public static string[] SqlWhereArray = {                                  " 条件1 ",                                 " 条件2 ",                                 " 条件3 "                                 };                ///         /// sql的where条件说明        ///         public static string[] DateRemarkArray = {                              "20130101至20130331",                            "20130401至20130630",			    "20130701后",                             };        ///         /// 获取sql语句        ///         ///         ///         ///         /// 
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; } /// /// 获取总记录数 /// /// /// ///
public static string GetRecordSql(BusinessType type, string sqlWhere) { string columns = "count(*)"; return GetSql(type, columns, sqlWhere); } /// /// 获取数据 /// /// /// ///
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组件下载:

=========================================================

另外,NPOI只有 2.0以上版本才支持Excel 2007,用法

//自动辨别2007或2003
IWorkbook workbook = WorkbookFactory.Create(FileUpload1.FileContent);
//2007
XSSFWorkbook workbook = new XSSFWorkbook(FileUpload1.FileContent);
//2003
HSSFWorkbook workbook = new HSSFWorkbook(FileUpload1.FileContent);

转载地址:http://cezrf.baihongyu.com/

你可能感兴趣的文章
【Pyton】【小甲鱼】魔法方法
查看>>
单元测试需要具备的技能和4大阶段的学习
查看>>
【Loadrunner】【浙江移动项目手写代码】代码备份
查看>>
Python几种并发实现方案的性能比较
查看>>
[Jmeter]jmeter之脚本录制与回放,优化(windows下的jmeter)
查看>>
Jmeter之正则
查看>>
【JMeter】1.9上考试jmeter测试调试
查看>>
【虫师】【selenium】参数化
查看>>
【Python练习】文件引用用户名密码登录系统
查看>>
学习网站汇总
查看>>
【Python】用Python打开csv和xml文件
查看>>
【Loadrunner】性能测试报告实战
查看>>
【面试】一份自我介绍模板
查看>>
【自动化测试】自动化测试需要了解的的一些事情。
查看>>
【selenium】selenium ide的安装过程
查看>>
【手机自动化测试】monkey测试
查看>>
【英语】软件开发常用英语词汇
查看>>
Fiddler 抓包工具总结
查看>>
【雅思】雅思需要购买和准备的学习资料
查看>>
【雅思】雅思写作作业(1)
查看>>