【原创】WinForm导出数据到EXCEL(根据微软的Excel插件)
2012-06-04 16:49
357 查看
导出数据到Excel算是一个比较成熟的技术点了,现在的方法也比较,比如:可以用微软的EXCEL组件,第三方开源组件(NPOI,MyXls等等。)
今天我就首先说一下微软的EXCEL组件
在开发过程中可能出现一系列的问题
(1)Excel行数的限制,office2003的行数为65536行。如果超过这个行数应该再来一个sheet
(2)导出数据慢的问题,如果数据量比较小可能一般的程序逻辑看不出来它的性能问题,当我们导出的数据很多时,应该选择什么方案解决
(3) 导出的格式问题,一些导出到Excel中的格式可能需要计算,那么它就是数字型的
本例先简单说一下实现逻辑,不多说,直接上代码:
(1)添加引用
(2)可以写代码了
第一步:创建一个Excel工作薄
Interop.Excel.Application xlApp = new Interop.Excel.Application(); ////建立一个Excel.Application的新进程
Excel.Workbooks workbooks = xlApp.Workbooks; //工作薄的创建
Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); //工作表sheet的创建
【当然也可以用下面的代码创建工作表sheet】
object missing = System.Reflection.Missing.Value;
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets.Add(missing, missing, missing, missing);//添加一个sheet
第二步:插入数据
object[,] dataArray = new object[rowCount, colCount];
for (int j = 0; j < rowCount; j++)
{
for (int k = 0; k < colCount; k++)
{
dataArray[j, k] = drs[j][k].ToString();
}
}
worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowCount, colCount]).Value2 = dataArray;
注:这种方式是把一个二维数组的数据插入到Excel的固定区域,不用一个单元格一个单元格的插入,速度快很多。解决了导出数据慢的问题
可能你保存的时候定义Excel的格式,可以用NumberFormat来定义,例如:
worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowCount + 1, colCount]).NumberFormat = "@";
第三步:保存Excel
workbook.SaveAs(strFilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
workbook.Close(true, Type.Missing, Type.Missing);
workbook = null;
以上是最简洁的方式,不过第一个问题还没有给解决,直接上代码吧。主要是逻辑问题了。没有什么技术难点。
头一次写文章,主要记录自己开发过程的点点滴滴,如果能帮助大家一点最好,哈哈。
转载的请注原创地址,谢谢。
今天我就首先说一下微软的EXCEL组件
在开发过程中可能出现一系列的问题
(1)Excel行数的限制,office2003的行数为65536行。如果超过这个行数应该再来一个sheet
(2)导出数据慢的问题,如果数据量比较小可能一般的程序逻辑看不出来它的性能问题,当我们导出的数据很多时,应该选择什么方案解决
(3) 导出的格式问题,一些导出到Excel中的格式可能需要计算,那么它就是数字型的
本例先简单说一下实现逻辑,不多说,直接上代码:
(1)添加引用
(2)可以写代码了
第一步:创建一个Excel工作薄
Interop.Excel.Application xlApp = new Interop.Excel.Application(); ////建立一个Excel.Application的新进程
Excel.Workbooks workbooks = xlApp.Workbooks; //工作薄的创建
Excel.Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet); //工作表sheet的创建
【当然也可以用下面的代码创建工作表sheet】
object missing = System.Reflection.Missing.Value;
Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets.Add(missing, missing, missing, missing);//添加一个sheet
第二步:插入数据
object[,] dataArray = new object[rowCount, colCount];
for (int j = 0; j < rowCount; j++)
{
for (int k = 0; k < colCount; k++)
{
dataArray[j, k] = drs[j][k].ToString();
}
}
worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowCount, colCount]).Value2 = dataArray;
注:这种方式是把一个二维数组的数据插入到Excel的固定区域,不用一个单元格一个单元格的插入,速度快很多。解决了导出数据慢的问题
可能你保存的时候定义Excel的格式,可以用NumberFormat来定义,例如:
worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowCount + 1, colCount]).NumberFormat = "@";
第三步:保存Excel
workbook.SaveAs(strFilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);
workbook.Close(true, Type.Missing, Type.Missing);
workbook = null;
以上是最简洁的方式,不过第一个问题还没有给解决,直接上代码吧。主要是逻辑问题了。没有什么技术难点。
/// <summary> /// 导出Excel文件 /// </summary> /// <param name="ds">要导入到Excel的数据</param> public static string DataSetToExcel2(System.Data.DataSet ds) { string strFilePath = System.AppDomain.CurrentDomain.BaseDirectory + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls"; Interop.Excel.Application xlApp = new Interop.Excel.Application(); Interop.Excel.Workbooks workbooks = xlApp.Workbooks; Interop.Excel.Workbook workbook = workbooks.Add(Interop.Excel.XlWBATemplate.xlWBATWorksheet); try { if (ds.Tables.Count == 0) { return "没有数据导出"; } int MaxRowCount = 60000; //一个sheet的最大行数限制,主要考虑到office2003的行数有限 DataTable dt = ds.Tables[0];//数据源 int rowCount = dt.Rows.Count; int colCount = dt.Columns.Count; if (rowCount > 0 && rowCount <= MaxRowCount) { object missing = System.Reflection.Missing.Value; Interop.Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets.Add(missing, missing, missing, missing);//添加一个sheet //Worksheet worksheet = (Worksheet)workbook.Worksheets[i]; worksheet.Name = "sheet"; object[,] dataArray = new object[rowCount + 1, colCount]; //表头导出 for (int j = 0; j < colCount; j++) { dataArray[0, j] = dt.Columns[j].ColumnName.ToString(); } //内容导出 for (int j = 0; j < rowCount; j++) { for (int k = 0; k < colCount; k++) { dataArray[j + 1, k] = dt.Rows[j][k].ToString(); } } worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowCount + 1, colCount]).NumberFormat = "@"; worksheet.get_Range(worksheet.Cells[1, 1], worksheet.Cells[rowCount + 1, colCount]).Value2 = dataArray; } else //超过sheet表单的就再创适sheet表单 { int sheetCount = 1; //sheet表单个数 if (rowCount % MaxRowCount == 0) { sheetCount = rowCount / MaxRowCount; } else { sheetCount = rowCount / MaxRowCount + 1; } int Flag = 1; for (var m = 0; m < sheetCount; m++) { //添加一个sheet表单 object missing1 = System.Reflection.Missing.Value; Excel.Worksheet worksheet1 = (Excel.Worksheet)workbook.Worksheets.Add(missing1, missing1, missing1, missing1);//添加一个sheet worksheet1.Name = "第" + (m + 1) + "页sheet"; //如果是最后一个sheet的话 并且最后一个sheet表单数据不等于60000 if (Flag == sheetCount && (rowCount % MaxRowCount != 0)) { int newrowCount = rowCount - ((Flag - 1) * MaxRowCount); //最后一个sheet的数据 object[,] dataArray = new object[newrowCount + 1, colCount]; int RowIndex = 0; for (int j = 0; j < colCount; j++) { dataArray[0, j] = dt.Columns[j].ColumnName.ToString(); } int startIndex = (Flag - 1) * MaxRowCount; for (int n = startIndex; n < startIndex + newrowCount; n++) { for (int t = 0; t < colCount; t++) { dataArray[RowIndex + 1, t] = dt.Rows [t].ToString(); } RowIndex++; } worksheet1.get_Range(worksheet1.Cells[1, 1], worksheet1.Cells[newrowCount + 1, colCount]).NumberFormat = "@"; worksheet1.get_Range(worksheet1.Cells[1, 1], worksheet1.Cells[newrowCount + 1, colCount]).Value2 = dataArray; } else { object[,] dataArray = new object[MaxRowCount + 1, colCount]; int RowIndex = 0; for (int j = 0; j < colCount; j++) { dataArray[0, j] = dt.Columns[j].ColumnName.ToString(); } int startIndex = (Flag - 1) * MaxRowCount; for (int n = startIndex; n < startIndex + MaxRowCount; n++) { for (int t = 0; t < colCount; t++) { dataArray[RowIndex + 1, t] = dt.Rows [t].ToString(); } if (n % 100 == 0) { System.Windows.Forms.Application.DoEvents(); } RowIndex++; } worksheet1.get_Range(worksheet1.Cells[1, 1], worksheet1.Cells[MaxRowCount + 1, colCount]).NumberFormat = "@"; worksheet1.get_Range(worksheet1.Cells[1, 1], worksheet1.Cells[MaxRowCount + 1, colCount]).Value2 = dataArray; } Flag++; } } workbook.SaveAs(strFilePath, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); workbook.Close(true, Type.Missing, Type.Missing); workbook = null; } catch { xlApp.Quit(); xlApp = null; System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); GC.Collect(); return "出现异常"; } finally { System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks); System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp); GC.Collect(); } return "导出成功,导出文件路径:" + strFilePath; }
头一次写文章,主要记录自己开发过程的点点滴滴,如果能帮助大家一点最好,哈哈。
转载的请注原创地址,谢谢。
相关文章推荐
- C# Winform Excel的导出,根据excel模板导出数据
- 根据Excel模板导出Excel数据
- Excel中根据XML映射导出XML数据
- 依赖POI实现EXCEL导入数据并生成javaBean和EXCEL根据数据库表导出
- 在Winform中我常用的两种把DataGridView数据导出Excel的方法
- php导出excel格式的数据(不利于插件)
- 【原创】C#导出数据到EXCEL方法谈(附实例源码和超级无敌详细讲解)
- [原创]大量数据导出为Excel文件的问题解决(C#,ASP.NET)
- winform 中 将listview数据 以excel格式导出 保存在可选择的文件夹下 但文件打开的时候有问题
- Java ssh poi 根据条件查询数据导出excel到浏览器 下载框不显示 浏览器乱码 之前是用submit()
- 利用Grails Export插件 导出数据(原创)
- 浅谈控件(组件)制作方法一(附带一delphi导出数据到Excel的组件实例)(原创)
- C# WinForm程序中将DataGridView中的数据导出为EXCEL
- .Net中导出数据到Excel(asp.net和winform程序中)
- [WinForm每日一帖] UltraGrid导出数据到Excel
- asp.net如何实现excel导入到sql或者根据需要再将sql中的数据导出到excel表格中
- C# WinForm 实现增删改查等功能(Access版) 系列之八-导出数据到Excel
- WinForm中把DataGrid里面的数据导出成EXCEL文件(VB.net)
- 配置导出MOSS2010列表数据到Excel并根据列表记录自动刷新数据
- C#数据导入/导出Excel文件及winForm导出Execl总结