现在的位置: 首页 > 综合 > 正文

C#.net 根据DataSet或DataTable创建Excel的方式

2013年12月07日 ⁄ 综合 ⁄ 共 3134字 ⁄ 字号 评论关闭

网上这个的资料好多都有点问题,我也是从网上找的,然后自己改完后才成功的。 (在此不记名感谢无私发布资源的n位童鞋)

希望看了我的文章的童鞋可以自行测试下Microsoft.Office.Interop.Excel.Application 下的SaveAs 和SaveCopyAs的区别。

另外这个程序需要添加 Microsoft.Office.Interop.Excel 的 引用。 并且操作完后一定注意释放资源,否则你创建的excel会一直被占用。 只能从任务管理器中关掉相关线程才行。

好了,上代码:

    /// <summary>
        /// 根据dataset创建excel
        /// </summary>
        /// <param name="ds">要导出的DataSet</param>
        /// <param name="strExcelFileName">要导出的文件名(详细路径加文件名)</param>
        public string CreateExcelByDataSet(DataSet ds, string strExcelFileName)
        {
            Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();
            if (excel == null)
            {
                return "无法启动Excel,可能您的电脑未安装Excel";
            }
            try
            {
                int rowIndex = 1;
                int colIndex = 0;
                excel.Application.Workbooks.Add(true);
                System.Data.DataTable table = ds.Tables[0];
                foreach (DataColumn col in table.Columns)
                {
                    colIndex++;
                    excel.Cells[1, colIndex] = col.ColumnName;
                }

                foreach (DataRow row in table.Rows)
                {
                    rowIndex++;
                    colIndex = 0;
                    foreach (DataColumn col in table.Columns)
                    {
                        colIndex++;
                        excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
                    }
                }
                excel.Visible = false;
                excel.DisplayAlerts = false;
                System.Reflection.Missing miss = System.Reflection.Missing.Value;
                excel.ActiveWorkbook.SaveAs(strExcelFileName, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss, miss, miss); ;
                excel.Quit();
                return "数据导出成功!";
            }
            catch (Exception ex)
            {
                return "出现异常!\r\n"+ex.Message;
            }
            finally
            {
                GC.Collect();//垃圾回收
            }
        }

        /// <summary>
        /// 根据封装的datatable创建excel
        /// </summary>
        /// <param name="tmpDataTable"></param>
        /// <param name="strFileName"></param>
        public string CreateExcelByDataTable(DataTable tmpDataTable, string strFileName)
        {
            if (tmpDataTable == null)
                return "待写数据为空!请检查。";
            int rowNum = tmpDataTable.Rows.Count;
            int columnNum = tmpDataTable.Columns.Count;
            int rowIndex = 1;
            int columnIndex = 0;
            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            xlApp.DefaultFilePath = "";
            xlApp.DisplayAlerts = true;
            xlApp.SheetsInNewWorkbook = 1;
            Microsoft.Office.Interop.Excel.Workbook xlBook = xlApp.Workbooks.Add(true);
            //将DataTable的列名导入Excel表第一行
            foreach (DataColumn dc in tmpDataTable.Columns)
            {
                columnIndex++;
                xlApp.Cells[rowIndex, columnIndex] = dc.ColumnName;
            }
            //将DataTable中的数据导入Excel中
            for (int i = 0; i < rowNum; i++)
            {
                rowIndex++;
                columnIndex = 0;
                for (int j = 0; j < columnNum; j++)
                {
                    columnIndex++;
                    xlApp.Cells[rowIndex, columnIndex] = tmpDataTable.Rows[i][j].ToString();
                }
            }

            System.Reflection.Missing miss = System.Reflection.Missing.Value;
            xlBook.SaveAs(strFileName, miss, miss, miss, miss, miss, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, miss, miss, miss, miss, miss);
            xlBook.Close(false, miss, miss);
            xlApp.Quit();
            GC.Collect();
            return "Success!";
        }

抱歉!评论已关闭.