具体的配置过程如下: 1:在服务器上安装Excel. 2:文件工作目录添加everyone用户并且拥有修改的权限. 3:在web.config文件中加入: <identity impersonate="true"/>
C#-Doce //上传excel文件 protected void flUpload_Click(object sender, EventArgs e) { if (txtFile.FileContent.Length > 0) { string fileName = txtFile.FileName; string extensionName = Path.GetExtension(fileName).ToLower(); if (extensionName.Equals(".xls") || extensionName.Equals(".xlsx")) { fileName = Path.GetFileNameWithoutExtension(fileName) + DateTime.Now.ToString("-yyyyMMddhhmmss") + extensionName; string physicalPath = Request.PhysicalApplicationPath + "ExcelFiles\\"; if (Directory.Exists(physicalPath)) Directory.CreateDirectory(physicalPath); string mapPath = Server.MapPath(YQKC.Common.WebUtility.app() + "ExcelFiles/" + fileName); FileInfo fi = new FileInfo(mapPath); txtFile.SaveAs(mapPath); GetExcelContent(mapPath, extensionName); } else { ScriptManager.RegisterStartupScript(this, this.GetType(), "", "alert('格式不正确!');", true); } } }
//导入 private void GetExcelContent(string filepath, string extensionName) { try { string connString = (extensionName.Equals("xls")) ? "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + filepath + ";Extended Properties='Excel 8.0;HDR=YES;IMEX=1'" : "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filepath + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; System.Data.OleDb.OleDbConnection conn = new System.Data.OleDb.OleDbConnection(connString); conn.Open(); System.Data.OleDb.OleDbCommand command = new System.Data.OleDb.OleDbCommand("SELECT * FROM [盘点单$]", conn);
DataTable dt = (DataTable)Session["DataTable"]; DataRow dr; for (int ii = 0; ii < int.Parse(hdfrindex.Value); ii++) { TextBox tb0 = (TextBox)GVList.Rows[ii].FindControl("Txtsl"); TextBox tb1 = (TextBox)GVList.Rows[ii].FindControl("Txtmxbz"); TextBox tb2 = (TextBox)GVList.Rows[ii].FindControl("Txtzmkc"); TextBox tb3 = (TextBox)GVList.Rows[ii].FindControl("Txtgx"); HiddenField hd = (HiddenField)GVList.Rows[ii].FindControl("HDGX"); if (dt.Rows[ii]["rIndex"].ToString() != "-1") { dt.Rows[ii]["Quantity"] = tb0.Text.Trim(); dt.Rows[ii]["OI"] = tb1.Text.Trim(); dt.Rows[ii]["BQ"] = tb2.Text.Trim(); }//写入数量 } DataRow[] drs = dt.Select("rIndex = '-1'"); for (int ii = 0; ii < drs.Length; ii++) { dt.Rows.Remove(drs[ii]); }
int cIndex = int.Parse(hdfcindex.Value);//修改时的行号 int gIndex = int.Parse(hdfrindex.Value);//新增时的行号 gIndex = gIndex < cIndex ? cIndex : gIndex;//修正gIndex int i = gIndex > cIndex - 1 && gIndex > 0 ? cIndex : gIndex;//当前编辑行号
using (System.Data.OleDb.OleDbDataReader sdr = command.ExecuteReader()) { if (sdr.HasRows) { while (sdr.Read()) { string id = sdr[0].ToString(); if (id.Equals("")) { continue; } if (dt.Select("GoodsID='" + id + "'").Length > 0) { continue; } dr = dt.NewRow(); dr["ID"] = "0"; dr["GoodsID"] = id; dr["Code"] = sdr[1].ToString(); dr["Name"] = sdr[2].ToString(); dr["Unit"] = sdr[3]; dr["Model"] = sdr[4].ToString(); dr["BQ"] = sdr[5].ToString(); dr["Quantity"] = sdr[6].ToString(); dr["ImgNum"] = sdr[7].ToString(); dr["OI"] = sdr[8].ToString(); dr["rIndex"] = i; dt.Rows.Add(dr); i++; } } } gIndex = i; gIndex = gIndex > cIndex ? gIndex : gIndex + 1; hdfrindex.Value = gIndex.ToString();//保存当前的gIndex if (dt.Rows[dt.Rows.Count - 2]["rIndex"].ToString() != "-1" && gIndex >= dt.Rows.Count) { dt = addRows(dt);//满10行自动增加1行 } if (dt.Rows.Count < 12) { int counts = 12 - dt.Rows.Count; for (int j = 0; j < counts; j++) { dt = addRows(dt);//满10行自动增加1行 } } dt.Dispose(); Session["DataTable"] = dt; GVList.DataSource = (DataTable)Session["DataTable"]; GVList.DataBind(); conn.Close(); } catch (Exception) { ScriptManager.RegisterStartupScript(this, this.GetType(), "", "alert('导入失败!')", true);
} }
//导出 protected void lkbOutExcel_Click(object sender, EventArgs e) { GridViewToExcel(GVList, "盘点单"); }
#region /// <summary> /// 将GridView中的数据导入到Excel中 /// </summary> /// <param name="datagridview">GridView</param> /// <param name="SheetName">Excel sheet title</param> public void GridViewToExcel(GridView datagridview, string SheetName) { GC.Collect(); int iRows = 0; int iCols = 0; int iTrueCols = 0; int notEmptyRow = 0; iTrueCols = datagridview.Columns.Count; iRows = datagridview.Rows.Count; for (int i = 0; i < datagridview.Columns.Count; i++) { if (datagridview.Columns[i].Visible) iCols++; } string[,] dimArray = new string[iRows, iCols]; dimArray[0, 0] = "ID"; for (int j = 1, k = 1; j < iTrueCols; j++) { if (datagridview.Columns[j].Visible) { dimArray[0, k] = datagridview.Columns[j].HeaderText; k++; } } for (int i = 0; i < iRows - 1; i++) { if (!datagridview.DataKeys[i]["rIndex"].ToString().Equals("-1")) { dimArray[i + 1, 0] = datagridview.DataKeys[i]["GoodsID"].ToString(); dimArray[i + 1, 1] = datagridview.Rows[i].Cells[1].Text; dimArray[i + 1, 2] = ((TextBox)datagridview.Rows[i].FindControl("Txtmc")).Text; dimArray[i + 1, 3] = datagridview.Rows[i].Cells[3].Text; dimArray[i + 1, 4] = datagridview.Rows[i].Cells[4].Text; dimArray[i + 1, 5] = ((TextBox)datagridview.Rows[i].FindControl("Txtzmkc")).Text; dimArray[i + 1, 6] = ((TextBox)datagridview.Rows[i].FindControl("Txtsl")).Text; dimArray[i + 1, 7] = ((TextBox)datagridview.Rows[i].FindControl("TxtImgNum")).Text; dimArray[i + 1, 8] = ((TextBox)datagridview.Rows[i].FindControl("Txtmxbz")).Text; notEmptyRow++; } } if (dimArray.Length > 0) { excel::Application app = null; excel::Workbook wb = null; excel::Worksheet ws = null; try { app = new excel::Application(); wb = app.Workbooks.Add(Missing.Value); if (wb.Worksheets.Count > 0) { ws = (excel::Worksheet)wb.Worksheets.get_Item(1); } else { wb.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value); ws = (excel::Worksheet)wb.Worksheets.get_Item(1); } if (ws != null) { if (SheetName.Trim() != "") { ws.Name = SheetName; } ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows, iCols]).Value2 = dimArray; ws.get_Range(ws.Cells[1, 1], ws.Cells[1, iCols]).Font.Bold = true; ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows, iCols]).Font.Size = 10.0; ws.get_Range(ws.Cells[1, 1], ws.Cells[iRows, iCols]).RowHeight = 14.25; ws.get_Range(ws.Cells[1, 1], ws.Cells[1, iCols]).Select(); ws.get_Range(ws.Cells[1, 1], ws.Cells[1, iCols]).Columns.AutoFit(); } app.Visible = false; string path = HttpContext.Current.Server.MapPath(".") + "\\" + SheetName + DateTime.Now.ToString("-yyyyMMddhhmmss") + ".xls"; wb.SaveCopyAs(path); wb.Close(false, null, null); app.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); System.Runtime.InteropServices.Marshal.ReleaseComObject(ws); wb = null; app = null; ws = null; GC.Collect(); FileInfo file = new FileInfo(path); Response.Clear(); Response.Charset = "GB2312"; Response.ContentEncoding = System.Text.Encoding.UTF8; Response.AddHeader("Content-Disposition", "attachment; filename=" + HttpContext.Current.Server.UrlEncode(file.Name)); Response.AddHeader("Content-Length", file.Length.ToString()); Response.ContentType = "application/ms-excel"; Response.WriteFile(file.FullName); Response.End(); } catch (Exception ex) { ScriptManager.RegisterStartupScript(this, this.GetType(), "", "alert('导出失败!');", true); } finally { if (app != null) { wb.Close(false, null, null); app.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(wb); System.Runtime.InteropServices.Marshal.ReleaseComObject(app); System.Runtime.InteropServices.Marshal.ReleaseComObject(ws); wb = null; app = null; ws = null; GC.Collect(); } } } else { ScriptManager.RegisterStartupScript(this, this.GetType(), "", "alert('数据为空,请输录入数据!');", true); } } #endregion
总结:com组件的导入导出方式比较麻烦,代码也比较复杂,但却是对excel的底层操作,可以设置excel的列宽,字体样式,对齐方式等,导出的是真正excel,这点还是让人比较欣慰的。。。