出现的问题:
以前我们公司一直用的一种导出Excel的方法:使用两个函数,直接把带有网页html标记的数据流输出成文件, 然后把文件后缀名改为xls,这种方式虽然编写代码的时候十分简单,而且速度也还可以。但是要导出这个xls文件必须要在页面上放一个隐藏的 datagrid,在导出的时候要重新绑定才能导出数据。这样导出的一个问题就是,这个文件实际上不是正真的xls文件,我们可以用记事本打开这个文件, 我们可以看到熟悉的html标记,所以这个文件是无法完全兼容所有excel格式的,如果我在excel中打开这个文件,然后在这个文件中插入一个 sheet,在sheet中输入一些内容,然后在保存,如果不另存为的话,这个文件会保存成一个网页文件,大家可以自己试一下。但是如果使用另存为xls 文件的话,那么这时候保存的就是正真的xls文件了。
还有一种方法就是我前面一片帖子里面写的,老王的那种直接写CSV文件的那种方法,这种方法对大数据量的适用性非常好,但是对于有格式数据来说就爱莫能助了,会出现格式乱七八糟的现象。
解决问题:
使用MyXls控件导出,这是一个开源的excel导出控件,我们可以直接在网上下载到。这个使用方法也很简单,直接引用这个控件,然后在代码中一格一格写过去就可以了,下面是示例代码:
org.in2bits.MyXls.XlsDocument doc = new org.in2bits.MyXls.XlsDocument();
doc.FileName = DateTime.Now.ToString().Replace("-","").Replace(":","").Replace(" ","")+".xls";excel文件名称
DataView dv = Function.SqlExcuter_ToDataView(hidSql.Value);//需要导出的数据
org.in2bits.MyXls.Worksheet sheet = doc.Workbook.Worksheets.AddNamed("sheet1");//工作表名称
org.in2bits.MyXls.Cells cells = sheet.Cells;
int colnum = DataGrid1.Columns.Count;
for(int i=0;i<colnum;i++)
{
cells.AddValueCell(1,(i+1), DataGrid1.Columns.HeaderText);//导出的第一列列名从datagrid中获得
}
for(int i=0;i<dv.Count;i++)
{
for(int j=0;j<colnum;j++)
{
if(j!=4)//这里我是因为我第四列是日期格式,我要把时间去掉,所以每行到第四列的时候我就把这个值处理一下
{
cells.AddValueCell((i+2),(j+1),dv[j].ToString());
}
else
{
cells.AddValueCell((i+2),(j+1),dv[j].ToString().Split(' ')[0]);
}
}
}
doc.Send();//把写好的excel文件输出到客户端
这个控件的导出速度也还可以,而且这个导出的xls文件就是真正的excel文件,能支持所有的excel功能。我们用记事本打开就会发现这里面都是经过编码的内容。
附件里面是要用到的dll,一共是四个,都要引用了才能使用以上的代码。
使用MyXls类导出excel