您的位置:首页 > 其它

【原创】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;

以上是最简洁的方式,不过第一个问题还没有给解决,直接上代码吧。主要是逻辑问题了。没有什么技术难点。

/// <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;
}


头一次写文章,主要记录自己开发过程的点点滴滴,如果能帮助大家一点最好,哈哈。

转载的请注原创地址,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: