今天开始自己写文章,有描述不当的地方请多指教。
   这里主要讲述两种方法,包括处理导出的乱码和格式化问题。
   (1)在客户端把GridView的数据导出到Excel格式文件。
   (2)使用COM组件把数据导出到Excel格式文件。
    这两种方法主要的区别(或者说是使用COM导出数据比较不理想的地方)是使用COM组件必须添加该组件的DLL的引用,由于组件有版本的不同,所以随之而来的将是因版本的不同而不能使用该功能。另一点区别就是使用COM组件前提是客户端必须有安装Excel。
    当然,你可以根据运用环境的不同使用不同的方法。以下贴出两种方法的代码,希望对大家有用。
    (1)fileName = HttpUtility.UrlEncode(“文件名”, “文件编码”);//如果文件名为中文格式,则可用这行代码对文件名进行编码。然后得用底下带(¥¥¥)行对其进行反编码,这样输出的文件名就不会是乱码。当然使用的编码要正确。
            
Code
  这就是在客户端导出数据的完整方法。
    (2)假设这里的数据源为Table1
        
Application excelApp = new ApplicationClass();            
         Workbook excelBook 
= excelApp.Workbooks.Add(Type.Missing);
        Worksheet excelSheet 
= (Worksheet)excelBook.Sheets.Add(Type.Missing, Type.Missing, Type.Missing, Type.Missing);
           excelSheet.Name 
= strTitle;
            excelApp.Visible 
= true
            
int rowCount = Table1.Rows.Count;
            
int colCount = Table1.Columns.Count;

           
object[,] dataArray = new object[rowCount + 1, colCount];//二维数组定义是多一个标题行。
            for (int j = 0; j < colCount; j++)
           
{
                dataArray[
0, j] = Table1.Columns[j].Caption;//导出字段标题。
                
//根据各列的数据类型设置Excel的格式。
                switch (Table1.Columns[j].DataType.ToString())//格式化单元格的输出格式
               
{
       
case "System.String":
                        excelSheet.get_Range(excelSheet.Cells[
11 + j], excelSheet.Cells[rowCount + 11 + j]).NumberFormatLocal = "@";
                        
break;
                   
case "System.Decimal":
                       excelSheet.get_Range(excelSheet.Cells[
11 + j], excelSheet.Cells[rowCount + 11 + j]).NumberFormatLocal = "$0.00";
                        
break;
                    
case "System.DateTime":
                        excelSheet.get_Range(excelSheet.Cells[
11 + j], excelSheet.Cells[rowCount + 11 + j]).NumberFormatLocal = "yyyy-mm-dd";
                        
break;
                    
//可以根据自己的需要扩展。
                    default:
                       excelSheet.get_Range(excelSheet.Cells[
11 + j], excelSheet.Cells[rowCount + 11 + j]).NumberFormatLocal = "G/通用格式";
                        
break;
                }

                
for (int i = 0; i < rowCount; i++)
                
{
                    dataArray[i 
+ 1, j] = Table1.Rows[i][j];
                }

       }

            excelSheet.get_Range(
"A1", excelSheet.Cells[rowCount + 1, colCount]).Value2 = dataArray;


        注:使用这种方法的时候需要注意两个地方。(1)必须对本地用户设置权限,可能会出现的错误是:检索 COM 类工厂中 CLSID 为 {00024500-0000-0000-C000-000000000046} 的组件时失败。对这个错误的解决办法将贴在下一篇。(2)导出的行号设置。很多人可能会遇到的错误是:
     异常类型: COMException
     异常消息: 异常来自 HRESULT:0x800A03EC
这个问题主要是因为导出的行号设置不对所引起的异常。在这个方法中使用到行号的有:
《1》excelSheet.get_Range(excelSheet.Cells[1, 1 + j], excelSheet.Cells[rowCount + 1, 1 + j]).NumberFormatLocal = "@";
《2》excelSheet.get_Range("A1", excelSheet.Cells[rowCount + 1, colCount]).Value2 = dataArray;
需注意的是excelSheet.Cells[1, 1 + j],,如果有标题的情况下,必须把标题行去掉,所以开始行是1,
    这样就算结尾了,第一篇文章,请大家多多指教。谢谢。
 posted on 2008-01-08 11:32  flank.chen  阅读(5427)  评论(4编辑  收藏  举报