C#DataTable导出Excel,并实现合并单元格

asp.net webwofrm后台代码----------建议Framework4.0及以上,3.5试过出现好多莫名错误...

首先导入两个程序集。我的是 office2003,引用的COM里面的 Microsoft.office.Interop.Excel 14.0   和 程序集里的Microsoft Excel 12.0 Object Library。有多个版本,根据自己的office版本选择。

添加之后引用里力会出现两个DLL Microsoft.office.Core 和Microsoft.office.Interop.Excel

生成一下项目,如果出现  Excel.ApplicationClass()无法互嵌套操作类型 请改用适用的接口 

把引用的Microsoft.Office.Interop.Excel 右击属性 嵌入互操作类型改为false即可

DataTable dt = new DataTable();
DataColumn dc1 = new DataColumn();
dc1.ColumnName = "name";
dc1.DataType = typeof(string);
DataColumn dc2 = new DataColumn();
dc2.ColumnName = "age";
dc2.DataType = typeof(int);
dt.Columns.Add(dc1);
dt.Columns.Add(dc2);
for (int i = 0; i < 1000; i++)
{
DataRow dr = dt.NewRow();
dr[0] = "茂茂" + i + "";
dr[1] = i;
dt.Rows.Add(dr);
}
new Class1().DataTabletoExcel(dt, DateTime.Now.Ticks+".xlsx");

先造些数据,然后将datatable和要导出文件名传递给方法。

DataTabletoExcel 方法体,一般的DataTable可以直接导出。比较复杂的结构需要自己定义
/// ///不要图省劲省略了System.Data。Microsoft.office.Interop.DataTable 和System.Data.DataTable 会产生歧义
        public  void DataTabletoExcel(System.Data.DataTable tmpDataTable, string strFileName)
        {

            ///先得到datatable的行数
            int rowNum = tmpDataTable.Rows.Count;
            ///列数
            int columnNum = tmpDataTable.Columns.Count;
            ///声明一个应用程序类实例
            Application xlApp = new ApplicationClass();

            //xlApp.DefaultFilePath = "";  ///默认文件路径,将其设置路径后发现没什么变化。导出excel的路径还是在参数strFileName里设置
            //xlApp.DisplayAlerts = true;
            //xlApp.SheetsInNewWorkbook = 1;///返回或设置 Microsoft Excel 自动插入到新工作簿中的工作表数目。Long 类型,可读写。设置为2之后没发现什么区别
            //创建一个新工作簿
            Workbook xlBook = xlApp.Workbooks.Add();
            ///在工作簿中得到sheet。
            _Worksheet oSheet = (_Worksheet)xlBook.Worksheets[1];
            #region 绘制列
            ///自定义方法,想sheet中绘制列
            RangeBuild(oSheet, "A1", "A2", "编号");
            RangeBuild(oSheet, "B1", "B2", "畜主");
            RangeBuild(oSheet, "C1", "C2", "地址");
            RangeBuild(oSheet, "D1", "D2", "区划");
            RangeBuild(oSheet, "E1", "E2", "规模");
            RangeBuild(oSheet, "F1", "H1", "总存栏量");
            RangeBuild(oSheet, "F2", "F2", "期初");
            RangeBuild(oSheet, "G2", "G2", "期末");
            RangeBuild(oSheet, "H2", "H2", "变更");
            RangeBuild(oSheet, "I1", "K1", "母猪");
            RangeBuild(oSheet, "I2", "I2", "期初");
            RangeBuild(oSheet, "J2", "J2", "期末");
            RangeBuild(oSheet, "K2", "K2", "变更");
            RangeBuild(oSheet, "L1", "N1", "肉猪");
            RangeBuild(oSheet, "L2", "L2", "期初");
            RangeBuild(oSheet, "M2", "M2", "期末");
            RangeBuild(oSheet, "N2", "N2", "变更");
            RangeBuild(oSheet, "O1", "Q1", "仔猪");
            RangeBuild(oSheet, "O2", "O2", "期初");
            RangeBuild(oSheet, "P2", "P2", "期末");
            RangeBuild(oSheet, "Q2", "Q2", "变更");
            RangeBuild(oSheet, "R1", "T1", "公猪");
            RangeBuild(oSheet, "R2", "R2", "期初");
            RangeBuild(oSheet, "S2", "S2", "期末");
            RangeBuild(oSheet, "T2", "T2", "变更");
            RangeBuild(oSheet, "U1", "W1", "总面积");
            RangeBuild(oSheet, "U2", "U2", "期初");
            RangeBuild(oSheet, "V2", "V2", "期末");
            RangeBuild(oSheet, "W2", "W2", "变更");
            RangeBuild(oSheet, "X1", "Z1", "批建");
            RangeBuild(oSheet, "X2", "X2", "期初");
            RangeBuild(oSheet, "Y2", "Y2", "期末");
            RangeBuild(oSheet, "Z2", "Z2", "变更");
            RangeBuild(oSheet, "AA1", "AC1", "未批建");
            RangeBuild(oSheet, "AA2", "AA2", "期初");
            RangeBuild(oSheet, "AB2", "AB2", "期末");
            RangeBuild(oSheet, "AC2", "AC2", "变更");
            #endregion 
            //将DataTable中的数据导入Excel中
            for (int i = 0; i < rowNum; i++)
            {
             
                for (int j = 0; j < columnNum; j++)
                {
                   ///excel中的列是从1开始的
                    xlApp.Cells[i+2, j+1] = tmpDataTable.Rows[i][j].ToString();
                }
            }
            ///保存,路径一块穿进去。否则回到一个很奇妙的地方,貌似是system32里 temp下....
            oSheet.SaveAs(@"D:\a\" + strFileName);
        }

        private static void RangeBuild(_Worksheet oSheet,string startcell,string endcell,string value)
        {
            ///创建一个区域对象。第一个参数是开始格子号,第二个参数是终止格子号。比如选中A1——D3这个区域。
            Range range = (Range)oSheet.get_Range(startcell, endcell);
            ///合并方法,0的时候直接合并为一个单元格
            range.Merge(0);
            ///合并单元格之后,设置其中的文本
            range.Value = value;
            //横向居中
            range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
            ///字体大小
            range.Font.Size = 18;
        ///字体
            range.Font.Name = "黑体";
            ///行高
            range.RowHeight = 24;
            //自动调整列宽
            range.EntireColumn.AutoFit();
            //填充颜色
            range.Interior.ColorIndex = 20;
            //设置单元格边框的粗细
            range.Cells.Borders.LineStyle = 1;
        }

我这样导出的excel是这样子的

 

posted @ 2017-05-02 09:45  足迹,积少成多  阅读(2514)  评论(1编辑  收藏  举报