NPOI大数据分批写入同个Excel
2023-09-27 14:22:41 时间
实现过程:
要导出来的数据库数据量很大,一次取出来压力有点大,故分批取出来,导入到同一个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); } } }
相关文章
- PHP读取Excel内的图片
- Python + Excel | 可视化疫苗接种随时间变化情况
- Transfer data to SQL Server from SPC-Light with Excel macros
- Python中,添加写入数据到已经存在的Excel的xls文件,即打开excel文件,写入新数据
- vba基础(excel)(3)感谢兰色幻想 ,是对A列所有的都求和(和放在最后一行)
- 如何用Perl对Excel的数据进行提取并分析
- 据说excel流是这么做,上次我分享的是csv格式。这个是excel格式。
- 读取excel数据报空指针
- Excel中的一列数据变成文本的一行数据
- SQL Server读取及导入Excel数据
- Excel 一个工作表进行按行数拆分
- python处理Excel实现自动化办公教学(数据筛选、公式操作、单元格拆分合并、冻结窗口、图表绘制等)【三】
- python进阶3-操作excel
- CSV转成Excel格式
- php Spreadsheet实现图片资源数据批量导出excel表格
- android 读取excel表格数据(暂时只支持xls格式)
- 百万级数据excel导出功能如何实现?
- .NET Core(C#)使用NPOI创建Excel(.xls,xlsx)并将另一个Excel中指定的数据写入
- 在Excel中将某一列的格式通过数据分列彻底变为文本格式
- 使用EasyExcel导入excel中的日期格式数据时获取到的却是一个数字
- python - 写入数据到Excel - 写入多个sheet