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和要导出文件名传递给方法。

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

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");





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 C#导出 Excel合并单元格,可以使用 `Microsoft.Office.Interop.Excel` 库。下面是一个示例代码,演示了如何导出一个 DataTable合并某些单元格: ```csharp using System; using System.Data; using System.IO; using System.Windows.Forms; using Excel = Microsoft.Office.Interop.Excel; namespace ExcelExportDemo { public partial class MainForm : Form { public MainForm() { InitializeComponent(); } private void ExportButton_Click(object sender, EventArgs e) { // 创建一个新的 Excel 应用程序实例 Excel.Application excelApp = new Excel.Application(); excelApp.Visible = false; // 创建一个工作簿并获取其工作表 Excel.Workbook workbook = excelApp.Workbooks.Add(); Excel.Worksheet worksheet = workbook.ActiveSheet; // 获取 DataTable 的列数和行数 int columnCount = dataTable.Columns.Count; int rowCount = dataTable.Rows.Count; // 写入标题行 for (int i = 0; i < columnCount; i++) { worksheet.Cells[1, i + 1] = dataTable.Columns[i].ColumnName; } // 写入数据行 for (int i = 0; i < rowCount; i++) { for (int j = 0; j < columnCount; j++) { worksheet.Cells[i + 2, j + 1] = dataTable.Rows[i][j].ToString(); } } // 合并单元格 Excel.Range range = worksheet.Range[worksheet.Cells[1, 1], worksheet.Cells[1, columnCount]]; range.Merge(); // 设置合并后单元格的样式 range.Font.Size = 16; range.Font.Bold = true; range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter; // 保存 Excel 文件 SaveFileDialog saveFileDialog = new SaveFileDialog(); saveFileDialog.Filter = "Excel 文件|*.xlsx"; saveFileDialog.Title = "保存 Excel 文件"; saveFileDialog.ShowDialog(); if (saveFileDialog.FileName != "") { workbook.SaveAs(saveFileDialog.FileName); workbook.Close(); excelApp.Quit(); MessageBox.Show("导出成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); } else { MessageBox.Show("未选择文件路径!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } } } ``` 在这个示例中,我们首先在标题行上合并了所有单元格,并设置了合并后单元格的样式。你可以根据需要更改合并的范围、样式等。 希望这个示例对你有所帮助!如果还有其他问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值