如何导入数据至Excel文件 C#.net

    以下资料均从网上各类提问和博客中,整理出来。

 

    如果Excel不需要合并单元格,没有太复杂的格式,将数据库表格数据导入到Excel中,有一个非常简单的办法:

    1. 将数据读到DataTable对象中,然后绑定到一个ASP.NET的web控件DataGrid(可设置Visible为false)中

    2. 使用以下方法,将DataGrid的HTML内容使用Response对象输出到页面上来。

    //********************************************************** /// <summary> /// DataGrid导出Excel /// </summary> /// <param name="dgData">DataGrid名</param> /// <returns></returns> //********************************************************** public void DataGrid2Excel(System.Web.UI.WebControls.DataGrid dgData,string FileName) { Response.Clear(); // 另存为的文件名 FileName += DateTime.Now.ToString("yy")+DateTime.Now.ToString("MM")+DateTime.Now.ToString("dd")+DateTime.Now.ToString("hh")+DateTime.Now.ToString("mm")+DateTime.Now.ToString("ss"); // 设置编码 FileName=HttpUtility.UrlEncode(FileName,System.Text.Encoding.UTF8); Response.AddHeader("content-disposition", "attachment;filename="+FileName+".xls"); Response.Charset = "UTF-8"; Response.ContentEncoding=System.Text.Encoding.GetEncoding("UTF-8"); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.ContentType = "application/vnd.xls"; System.IO.StringWriter stringWrite = new System.IO.StringWriter(); System.Web.UI.HtmlTextWriter htmlWrite = new HtmlTextWriter(stringWrite); dgData.RenderControl(htmlWrite); Response.Write(stringWrite.ToString()); Response.End(); }

   

    如果Excel中需要合并单元格呢?例如:现在要列出一批订单数据,需要显示订单的总金额、运费以及订购产品和订购数量。

    一张订单跟产品的关联是一对多的关系,因此用在一张表格中显示出来,就无可避免遇到上述问题,而给出的第一种导出Excel方法,显然达不到效果,那么如何处理呢?

    首先要肯定的是,我们不可能通过操作DataTable或DataGrid达到合并单元格的效果,只有通过操作Excel对象才能达到要求。

    1. 首先保证机器安装了office 11,并安装了Excel。

    2. 在项目中添加引用,在com标签页中,找到“Microsoft Excel 11.0 Object Library”项,添加进来。

    3. 后台cs类中,需要引入以下命名空间:

    using System.IO; using System.Runtime.InteropServices; using Microsoft.Office.Interop.Excel; using ExcelApplication = Microsoft.Office.Interop.Excel.ApplicationClass;

    4. 利用Excel.ApplicationClass类,我们可以将DataTable中的列名与数据读出来,输出到Excel中,并可以具体操作到任意一个单元格,以下是我写的一个例子中的代码块:

    // DataTable获得数据的内容不累述 ApplicationClass ac = new ApplicationClass(); ac.Visible = false; // Excel不显示 Workbook wkbook = ac.Workbooks.Add(true); // 添加工作簿 Worksheet wksheet = (Worksheet)wkbook.ActiveSheet; // 获得工作表 int rowIndex = 2; // 行 int colIndex = 1; // 列 ac.DisplayAlerts = false; // 关闭提示,采用默认的方案执行(合并单元格的时候,如果两个单元格都有数据,会出现一个确认提示) // 设置单元格格式 wksheet.get_Range(ac.Cells[1, 1], ac.Cells[orderList.Rows.Count + 1, orderList.Columns.Count + 1]).NumberFormat = "@"; wksheet.get_Range(ac.Cells[1, 1], ac.Cells[orderList.Rows.Count + 1, orderList.Columns.Count + 1]).Font.Size = 10; // 设置标题列 foreach (DataColumn dc in orderList.Columns) { wksheet.Cells[1, colIndex] = dc.ColumnName; colIndex++; } // 填充数据很简单无非是一个2重循环,下面看起来逻辑很复杂是因为添加了合并单元格的代码 for (int i = 0; i < orderList.Rows.Count; i++) { colIndex = 1; for (int j = 0; j < orderList.Columns.Count; j++) { if (orderList.Columns[j].DataType == System.Type.GetType("System.DateTime")) { try { // 如果单元格前不加"'",有些字段会自动采用科学计数法 ac.Cells[rowIndex, colIndex] = "'" + (Convert.ToDateTime(orderList.Rows[i][orderList.Columns[j].ColumnName].ToString())).ToString("yyyy-MM-dd"); } catch (System.FormatException) { ac.Cells[rowIndex, colIndex] = ""; } } else if (orderList.Columns[j].DataType == System.Type.GetType("System.String")) { ac.Cells[rowIndex, colIndex] = "'" + orderList.Rows[i][orderList.Columns[j].ColumnName].ToString(); } else { ac.Cells[rowIndex, colIndex] = "'" + orderList.Rows[i][orderList.Columns[j].ColumnName].ToString(); } wksheet.get_Range(ac.Cells[rowIndex, colIndex], ac.Cells[rowIndex, colIndex]).HorizontalAlignment = XlHAlign.xlHAlignLeft; colIndex++; } // 上一行订单编号 string lastOrderNO = "", curOrderNO = ""; curOrderNO = orderList.Rows[i]["订单号"].ToString(); if (i > 0) lastOrderNO = orderList.Rows[i - 1]["订单号"].ToString(); // 合并单元格 if (lastOrderNO != "" && lastOrderNO == curOrderNO) { Range r; r = wksheet.get_Range(wksheet.Cells[rowIndex - 1, 1], wksheet.Cells[rowIndex, 1]); // 合并订单编号 r.MergeCells = true; Range r1; r1 = wksheet.get_Range(wksheet.Cells[rowIndex - 1, 8], wksheet.Cells[rowIndex, 8]); r1.MergeCells = true; Range r2; r2 = wksheet.get_Range(wksheet.Cells[rowIndex - 1, 9], wksheet.Cells[rowIndex, 9]); r2.MergeCells = true; Range r3; r3 = wksheet.get_Range(wksheet.Cells[rowIndex - 1, 10], wksheet.Cells[rowIndex, 10]); r3.MergeCells = true; Range r4; r4 = wksheet.get_Range(wksheet.Cells[rowIndex - 1, 11], wksheet.Cells[rowIndex, 11]); r4.MergeCells = true; } rowIndex++; } string filename = Server.MapPath("../Order/") + DateTime.Now.ToString("yyyyMMddHHmmssfff") + ".xls"; wkbook.SaveAs(fileName, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, XlSaveAsAccessMode.xlNoChange, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing); wkbook.Close(Type.Missing, Type.Missing, Type.Missing); ac.Quit(); wkbook = null; ac = null; GC.Collect(); // 强制垃圾回收

 

 

    在调试过程中,我遇到了几个Bug:

    1). 异常来自 HRESULT:0x800A03EC。

         这个异常发生在“r = wksheet.get_Range(wksheet.Cells[rowIndex - 1, 1], wksheet.Cells[rowIndex, 1]);”,由于粗心导致,当wksheet.Cells中行与列的数值不对时,比如说行、列为“0”,就会报错了,仔细检查可以排除掉。

 

    2). 就是在合并单元格时,因为两个单元格都有数据,会提示合并单元格会选择左上角的数据,其他数据会被覆盖的确认对话框,每合并一个,弹出一个框,这个肯定是客户所不能接受的,后来添加这个属性设置之后“ac.DisplayAlerts = false; ”排除的。

 

    3). 第三个问题是最头疼的问题:现在已经拿到了想要的Excel了,可是我怎么将Excel展示给客户呢?上面的程序块中,将Excel写到了服务器上应用下的Order文件夹中,而客户却只能干瞪眼。

    这里我做了一个取巧的做法,那就是使用了一段客户端脚本:

    Response.Write("<mce:script type="text/javascript"><!-- window.open('" + fileName + "', '_bank', 'height=500, width=800, top=50, left=50, toolbar=no, menubar=no, scrollbars=yes, resizable=no,location=no, status=no'); // --></mce:script>");

    当前页面中,弹出一个窗口,窗口链接到Excel文件,那么客户会看到一个“打开/保存/取消”Excel文件的提示窗口,问题迎刃而解。

 

    4). 第四个问题较早解决了,那就是访问Excel.ApplicationClass的权限问题,这是在网上一些博客中找到的解决办法:

        (1) 开始->运行,输入“dcomcnfg”回车

        (2) 依次展开:组件服务->计算机->我的电脑->DCOM配置,找到“Microsoft Excel 应用程序”,右键属性

        (3) 弹出窗口中选择“标识”的标签页,勾中“交互式用户”

        (4) 选择“安全”标签页,将“启动与激活权限”、“访问权限”、“配置权限”全部选择自定义,然后分别点击“编辑”按钮,将ASPNET账户的权限添加进去即可。

补充:一些设置Excel格式的方法,这个是Copy自这位兄弟的Blog:http://blog.csdn.net/puleezi/archive/2007/06/24/1664098.aspx

 

using System; using System.Collections.Generic; using System.Text; using System.Reflection; using System.Runtime.InteropServices; using Microsoft.Office.Interop.Excel; using ExcelApplication = Microsoft.Office.Interop.Excel.ApplicationClass; namespace ExcalDemo { public class ExcelFiles { public void CreateExcelFiles() { //创建一个 Excel 实例 ExcelApplication excel = new ExcelApplication(); try { // 注释掉的语句是:从磁盘指定位置打开一个 Excel 文件 //excel.Workbooks.Open("demo.xls", Missing.Value, Missing.Value, //Missing.Value,Missing.Value, Missing.Value, Missing.Value, //Missing.Value, Missing.Value, Missing.Value, Missing.Value, //Missing.Value, Missing.Value, Missing.Value, Missing.Value); excel.Visible = false;// 不显示 Excel 文件,如果为 true 则显示 Excel 文件 excel.Workbooks.Add(Missing.Value);// 添加工作簿 Worksheet sheet = (Worksheet)excel.ActiveSheet;// 获取当前工作表 Range range = null;// 创建一个空的单元格对象 range = sheet.get_Range("A1", Missing.Value);// 获取单个单元格 range.RowHeight = 20; // 设置行高 range.ColumnWidth = 20; // 设置列宽 range.Borders.LineStyle = 1; // 设置单元格边框 range.Font.Bold = true; // 加粗字体 range.Font.Size = 20; // 设置字体大小 range.Font.ColorIndex = 5; // 设置字体颜色 range.Interior.ColorIndex = 6; // 设置单元格背景色 range.HorizontalAlignment = XlHAlign.xlHAlignCenter;// 设置单元格水平居中 range.VerticalAlignment = XlVAlign.xlVAlignCenter;// 设置单元格垂直居中 range.Value2 = "设置行高和列宽";// 设置单元格的值 range = sheet.get_Range("B2", "D4");// 获取多个单元格 range.Merge(Missing.Value); // 合并单元格 range.Columns.AutoFit(); // 设置列宽为自动适应 range.NumberFormatLocal = "#,##0.00";// 设置单元格格式为货币格式 // 设置单元格左边框加粗 range.Borders[XlBordersIndex.xlEdgeLeft].Weight = XlBorderWeight.xlThick; // 设置单元格右边框加粗 range.Borders[XlBordersIndex.xlEdgeRight].Weight = XlBorderWeight.xlThick; range.Value2 = "合并单元格"; // 页面设置 sheet.PageSetup.PaperSize = XlPaperSize.xlPaperA4; // 设置页面大小为A4 sheet.PageSetup.Orientation = XlPageOrientation.xlPortrait; // 设置垂直版面 sheet.PageSetup.HeaderMargin = 0.0; // 设置页眉边距 sheet.PageSetup.FooterMargin = 0.0; // 设置页脚边距 sheet.PageSetup.LeftMargin = excel.InchesToPoints(0.354330708661417); // 设置左边距 sheet.PageSetup.RightMargin = excel.InchesToPoints(0.354330708661417);// 设置右边距 sheet.PageSetup.TopMargin = excel.InchesToPoints(0.393700787401575); // 设置上边距 sheet.PageSetup.BottomMargin = excel.InchesToPoints(0.393700787401575);// 设置下边距 sheet.PageSetup.CenterHorizontally = true; // 设置水平居中 // 打印文件 sheet.PrintOut(Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); // 保存文件到程序运行目录下 sheet.SaveAs(System.Windows.Forms.Application.StartupPath + "/demo.xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value); excel.ActiveWorkbook.Close(false, null, null); // 关闭 Excel 文件且不保存 } catch (Exception ex) { MessageBox.Show(ex.Message); } finally { excel.Quit(); // 退出 Excel excel = null; // 将 Excel 实例设置为空 } } } }

你可能感兴趣的:(exception,工作,String,datagrid,Excel,Microsoft)