使用Office组件导出Excel表格

首先需要引用Microsoft.Office.Interop.Excel组件,如下图所示:

使用Office组件导出Excel表格

如果找不到此组件引用,可以引用Com里面的:Microsoft Excel 11.0 Object Library

使用Office组件导出Excel表格

以下为程序代码:

//合并单元格(参数为:sheet、起始单元格、结束单元格、单元格数据、字体大小(默认为9))其他需要单独控制的都可以加参数
        private void RangeBuild(_Worksheet oSheet, string startcell, string endcell, string value, int fontsize = 9)
        {
            ///创建一个区域对象。第一个参数是开始格子号,第二个参数是终止格子号。比如选中A1——D3这个区域。
            Range range = (Range)oSheet.get_Range(startcell, endcell);
            ///合并方法,0的时候直接合并为一个单元格
            range.Merge(0);
            //可以换行
            range.WrapText = true;
            ///合并单元格之后,设置其中的文本
            range.Value = value;
            //横向居中
            range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
            ///字体大小
            range.Font.Size = fontsize;
            ///行高
            range.RowHeight = 20;
            //自动调整列宽
            //range.EntireColumn.AutoFit();
            //列宽
            range.ColumnWidth = 3.2;
            //填充颜色
            //range.Interior.ColorIndex = 20;
            //给单元格加边框
            range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb());    
        }

        /// <summary>

        /// 将DataTable中的数据输出保存为Excel表格

        /// </summary>

        /// <param name="dt"></param>

        protected void ExportExcel(System.Data.DataTable dt, string strFilePath, string strSheetName,string AsmName,string tuhao)
        {
            if (dt == null || dt.Rows.Count == 0) return;

            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();


            if (xlApp == null)
            {
                return;
            }

            xlApp.DisplayAlerts = false;
            System.Globalization.CultureInfo CurrentCI = System.Threading.Thread.CurrentThread.CurrentCulture;

            System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US");

            Microsoft.Office.Interop.Excel.Workbooks workbooks = xlApp.Workbooks;

            Microsoft.Office.Interop.Excel.Workbook workbook = workbooks.Add(Microsoft.Office.Interop.Excel.XlWBATemplate.xlWBATWorksheet);

            Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1];

            //根据数据和每个sheet页的大小判断需要多少个sheet页
            int nPage = 0;
            int nSize = 42;

            if (dt.Rows.Count % nSize == 0)
            {
                nPage = dt.Rows.Count / nSize;
            }
            else
            {
                nPage = dt.Rows.Count / nSize + 1;
            }

            //大于一页就得多加Sheet
            if (nPage > 1)
            {
                for (int k = 1; k < nPage; k++)
                {
                    workbook.Sheets.Add(Type.Missing, (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[k], 1, Type.Missing);
                }
            }


            Range range = null;
            Worksheet Activesheet = null;
            for (int j = 1; j <= nPage; j++)
            {
                //每页的都要加表头
                Activesheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[j];

                RangeBuild(Activesheet, "A1", "C1", "");
                RangeBuild(Activesheet, "A2", "C2", "");
                RangeBuild(Activesheet, "A1", "A2", "公司名称或者项目名称", 8);

                RangeBuild(Activesheet, "D1", "O1", "明细表", 10);

                RangeBuild(Activesheet, "P1", "S1", tuhao);
                RangeBuild(Activesheet, "T1", "T1", "MX");
                RangeBuild(Activesheet, "D2", "I2", "项目名称", 10);
                RangeBuild(Activesheet, "J2", "O2", AsmName, 10);

                RangeBuild(Activesheet, "P2", "R2", string.Format("共{0}页",nPage));
                RangeBuild(Activesheet, "S2", "T2", string.Format("第{0}页",j));

                RangeBuild(Activesheet, "A3", "A5", "制表");
                RangeBuild(Activesheet, "B3", "B5", "");
                RangeBuild(Activesheet, "C3", "C5", "校队");

                RangeBuild(Activesheet, "D3", "F3", "");
                RangeBuild(Activesheet, "D4", "F4", "");
                RangeBuild(Activesheet, "D5", "F5", "");
                RangeBuild(Activesheet, "D3", "F5", "");

                RangeBuild(Activesheet, "G3", "G3", "标记");
                RangeBuild(Activesheet, "H3", "H3", "处数");

                RangeBuild(Activesheet, "I3", "K3", "许可编号");

                RangeBuild(Activesheet, "L3", "L3", "签名");
                RangeBuild(Activesheet, "M3", "O3", "日期");

                RangeBuild(Activesheet, "G4", "G4", "");
                RangeBuild(Activesheet, "G5", "G5", "");

                RangeBuild(Activesheet, "H4", "H4", "");
                RangeBuild(Activesheet, "H5", "H5", "");

                RangeBuild(Activesheet, "I4", "K4", "");
                RangeBuild(Activesheet, "I5", "K5", "");

                RangeBuild(Activesheet, "L4", "L4", "");
                RangeBuild(Activesheet, "L5", "L5", "");

                RangeBuild(Activesheet, "M4", "O4", "");
                RangeBuild(Activesheet, "M5", "O5", "");

                RangeBuild(Activesheet, "P3", "T3", "");
                RangeBuild(Activesheet, "P4", "T4", "");
                RangeBuild(Activesheet, "P5", "T5", "");
                RangeBuild(Activesheet, "P3", "P5", "日期");

                RangeBuild(Activesheet, "A6", "A7", "序号");

                RangeBuild(Activesheet, "B6", "G6", "");
                RangeBuild(Activesheet, "B7", "G7", "");
                RangeBuild(Activesheet, "B6", "B7", "代号");

                RangeBuild(Activesheet, "H6", "K6", "");
                RangeBuild(Activesheet, "H7", "K7", "");
                RangeBuild(Activesheet, "H6", "H7", "名称及规格");

                RangeBuild(Activesheet, "L6", "L7", "数量");

                RangeBuild(Activesheet, "M6", "O6", "");
                RangeBuild(Activesheet, "M7", "O7", "");
                RangeBuild(Activesheet, "M6", "M7", "材料");

                RangeBuild(Activesheet, "P6", "Q6", "单重");
                RangeBuild(Activesheet, "R6", "S6", "总重");

                RangeBuild(Activesheet, "P7", "S7", "公斤");

                RangeBuild(Activesheet, "T6", "T7", "备注");

                for (int r = nSize * (j - 1); r <= nSize * j - 1; r++)
                {
                    if (r < dt.Rows.Count)
                    {
                        int nstart = r + 8 - nSize * (j - 1);
                        range = (Microsoft.Office.Interop.Excel.Range)Activesheet.Cells[nstart, 1];
                        range.Value = dt.Rows[r][0].ToString();
                        //横向居中
                        range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
                        range.EntireColumn.AutoFit();
                        range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb());     //给单元格加边框

                        range = (Range)Activesheet.get_Range(string.Format("B{0}", nstart), string.Format("G{0}", nstart));
                        range.Merge(0);
                        range.Value = dt.Rows[r][1].ToString();
                        //range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
                        range.EntireColumn.AutoFit();
                        range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb());     //给单元格加边框

                        range = (Range)Activesheet.get_Range(string.Format("H{0}", nstart), string.Format("K{0}", nstart));
                        range.Merge(0);
                        range.Value = dt.Rows[r][2].ToString();
                        //range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
                        range.EntireColumn.AutoFit();
                        range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb());     //给单元格加边框

                        range = (Range)Activesheet.get_Range(string.Format("L{0}", nstart));
                        range.Value = dt.Rows[r][3].ToString();
                        //横向居中
                        range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
                        range.EntireColumn.AutoFit();
                        range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb());     //给单元格加边框

                        range = (Range)Activesheet.get_Range(string.Format("M{0}", nstart), string.Format("O{0}", nstart));
                        range.Merge(0);
                        range.Value = dt.Rows[r][4].ToString();
                        //横向居中
                        range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
                        range.EntireColumn.AutoFit();
                        range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb());     //给单元格加边框

                        range = (Range)Activesheet.get_Range(string.Format("P{0}", nstart), string.Format("Q{0}", nstart));
                        range.Merge(0);
                        range.Value = dt.Rows[r][5].ToString();
                        //横向居中
                        range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
                        range.EntireColumn.AutoFit();
                        range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb());     //给单元格加边框


                        range = (Range)Activesheet.get_Range(string.Format("R{0}", nstart), string.Format("S{0}", nstart));
                        range.Merge(0);
                        range.Value = dt.Rows[r][6].ToString();
                        //横向居中
                        range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
                        range.EntireColumn.AutoFit();
                        range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb());     //给单元格加边框

                        range = (Range)Activesheet.get_Range(string.Format("T{0}", nstart));
                        range.Merge(0);
                        range.Value = dt.Rows[r][7].ToString();
                        //横向居中
                        range.HorizontalAlignment = XlVAlign.xlVAlignCenter;
                        range.EntireColumn.AutoFit();
                        range.BorderAround(XlLineStyle.xlContinuous, XlBorderWeight.xlThin, XlColorIndex.xlColorIndexAutomatic, System.Drawing.Color.Black.ToArgb());     //给单元格加边框

                    }

                }


            }
            //将第一个Sheet页设置为活动Sheet
            ((Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[1]).Activate();

            //xlApp.Visible = true;
            workbook.SaveAs(strFilePath);


            //释放资源
            workbook.Close();
            xlApp.Quit();
            System.Runtime.InteropServices.Marshal.ReleaseComObject(range);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(worksheet);
                
            System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
            System.Runtime.InteropServices.Marshal.ReleaseComObject(xlApp);

            //调用GC的垃圾收集方法(必须)
            GC.Collect();
            GC.WaitForPendingFinalizers();

        }