C# 操作excel多个sheet 本帖最后由 SK_Aqi 于 2009-07-27 17:20:30 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 因为你每次new一个excel对象,然后再添加一个表,肯定只有一个了,先判断一个filename存不存在,如果存在workbookData = exce.WorkBooks.Open(.....这样就可以保存多个sheets了。 excel在方法体外new出来,你操作的不是同一个excel 慕白兄,给指教啊!我现在那部分赋值是这样的,好像还不对 workbookData = appExcel.Workbooks.Add(Missing.Value); if ("1".Equals(existfile)) workbookData = appExcel.Workbooks.Open(path, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "t", false, false, 0, true, Type.Missing, Type.Missing); else worksheetData = (Excel.Worksheet)workbookData.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value);//添加一个sheet worksheetData.Name = sheetname;//sheet命名 就是打开文件时: 名为"...xls"文档已经打开,不能同时打开同名文件. 对于excel的操作,哪怕是一个单元格,也要用变量声明出来,用完后设为null,否则进程不能正常退出 没有退出吗?最后一步还有GC.Collect();垃圾回收呢,如果真是要退出进程,我应该怎么做? 为有退出。对于excel的操作,哪怕是一个单元格,也要用变量声明出来,用完后设为null, 如:allDataWithTitleRange 用完后,要设为null 对,我设置了,你看这里: workbookData = null; appExcel = null; worksheetData = null; GC.Collect(); ASP.NET(C#)技术联盟高级群,欢迎工作中的朋友进来一起探讨并解决工作中遇到的问题!一群37078937(已满)二群37078867三群37078820(欢迎上海地区的朋友并爱好Dota的)严禁加多群,群定期清理长期不发言不讨论的朋友,请多包涵。 我是举个例子。如: appExcel.Cells[rowIndex, colIndex] = ==>Cell cell = appExcel.Cells[rowIndex, colIndex];cell==........cell = null;检查一下所有代码,否则excel进程无法退出。 好像这个cell不用声明,觉得不是进程的问题,原来导出一个sheet就没有问题,还有用exportTest(ds.Tables[0].DefaultView, filename, "testsheet2"); 再执行也可以重写,不会形成进程未结束的问题,请慕白兄指教啊! 让我哥们解决了,开心散分!代码如下:private void DataViewExcelBySheetMultipleDt(DataSet ds, string fileName) { try { int sheetCount = ds.Tables.Count; GC.Collect(); Application excel; _Workbook xBk; _Worksheet xSt = null; excel = new ApplicationClass(); xBk = excel.Workbooks.Add(true); int rowIndex = 0; int colIndex = 0; for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++) { rowIndex = 1; colIndex = 1; xSt = (_Worksheet)xBk.Worksheets.Add(Type.Missing, Type.Missing, 1, Type.Missing); switch (sheetIndex) { case 0: xSt.Name = "test1"; break; case 1: xSt.Name = "test2"; break; case 2: xSt.Name = "test3"; break; case 3: xSt.Name = "test4"; break; } foreach (DataColumn col in ds.Tables[sheetIndex].Columns) { xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter; xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).Font.Bold = true; excel.Cells[rowIndex, colIndex++] = col.ColumnName; } foreach (DataRow row in ds.Tables[sheetIndex].Rows) { rowIndex++; colIndex = 1; foreach (DataColumn col in ds.Tables[sheetIndex].Columns) { if (col.DataType == System.Type.GetType("System.DateTime")) { if (!"".Equals(row[col.ColumnName].ToString())) excel.Cells[rowIndex, colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("MM/dd/yyyy"); else excel.Cells[rowIndex, colIndex] = ""; } else if (col.DataType == System.Type.GetType("System.String")) { excel.Cells[rowIndex, colIndex] = "'" + row[col.ColumnName].ToString(); } else { excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString(); } colIndex++; } } Range allDataWithTitleRange = xSt.get_Range(excel.Cells[1, 1], excel.Cells[rowIndex, colIndex - 1]); allDataWithTitleRange.Select(); allDataWithTitleRange.Columns.AutoFit(); allDataWithTitleRange.Borders.LineStyle = 1; } string exportDir = "~/Attachment/"; string absFileName = HttpContext.Current.Server.MapPath(System.IO.Path.Combine(exportDir, fileName)); xBk.SaveCopyAs(absFileName); xBk.Close(false, null, null); excel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk); System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt); xBk = null; excel = null; xSt = null; GC.Collect(); } catch (Exception ex) { } }上面方法,首先形成一个多个DataTable的DataSet,重点还是,1. 生成一个新的xls时,打开方式,总是会提示进程占用,就像楼上说的那样2. 用不同的sheet时一定要命名3. 使用传入一个datatable时,总是会重写第一个sheet谨供大家参考 请问不规则EXCEL怎么处理?里面还有图片什么的。可以从表格的单元格颜色上分辨出不同的表格吗? 正则表达式 替换字符的问题 Asp.net 获取客户端windows登录用户名的问题 半天无法加载reporting 报表 textarea问题 谁最近有买ASP.NET方面的书籍,推荐几本自己感觉不错的,最好能适合有一定ASP.NET基础的。 关于authentication 访问用二级域名(泛解析)网站,如何同时打开多个不同二级域名,我现在只能打开一个 求救...由于访问量太大,数据库服务器2G的内存已全用完,CPU使用100%,我该怎么办啊,在线等... 关于画图的问题 gridview在databind后不显示数据 PrintDocument打印问题 求此句的具体解释
先判断一个filename存不存在,如果存在
workbookData = exce.WorkBooks.Open(.....
这样就可以保存多个sheets了。
慕白兄,给指教啊!
我现在那部分赋值是这样的,好像还不对
workbookData = appExcel.Workbooks.Add(Missing.Value);
if ("1".Equals(existfile))
workbookData = appExcel.Workbooks.Open(path, 0, true, 5, "", "", true, Excel.XlPlatform.xlWindows, "t", false, false, 0, true, Type.Missing, Type.Missing);
else
worksheetData = (Excel.Worksheet)workbookData.Worksheets.Add(Missing.Value, Missing.Value, Missing.Value, Missing.Value);//添加一个sheet
worksheetData.Name = sheetname;//sheet命名
就是打开文件时: 名为"...xls"文档已经打开,不能同时打开同名文件.
否则进程不能正常退出
如果真是要退出进程,我应该怎么做?
你看这里:
workbookData = null;
appExcel = null;
worksheetData = null;
GC.Collect();
严禁加多群,群定期清理长期不发言不讨论的朋友,请多包涵。
appExcel.Cells[rowIndex, colIndex] = ==>Cell cell = appExcel.Cells[rowIndex, colIndex];
cell==........cell = null;检查一下所有代码,否则excel进程无法退出。
还有用exportTest(ds.Tables[0].DefaultView, filename, "testsheet2");
再执行也可以重写,不会形成进程未结束的问题,请慕白兄指教啊!
代码如下:
private void DataViewExcelBySheetMultipleDt(DataSet ds, string fileName)
{
try
{
int sheetCount = ds.Tables.Count;
GC.Collect();
Application excel;
_Workbook xBk;
_Worksheet xSt = null;
excel = new ApplicationClass();
xBk = excel.Workbooks.Add(true); int rowIndex = 0;
int colIndex = 0;
for (int sheetIndex = 0; sheetIndex < sheetCount; sheetIndex++)
{
rowIndex = 1;
colIndex = 1;
xSt = (_Worksheet)xBk.Worksheets.Add(Type.Missing, Type.Missing, 1, Type.Missing);
switch (sheetIndex)
{
case 0:
xSt.Name = "test1";
break;
case 1:
xSt.Name = "test2";
break;
case 2:
xSt.Name = "test3";
break;
case 3:
xSt.Name = "test4";
break;
}
foreach (DataColumn col in ds.Tables[sheetIndex].Columns)
{
xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).HorizontalAlignment = XlVAlign.xlVAlignCenter;
xSt.get_Range(excel.Cells[rowIndex, colIndex], excel.Cells[rowIndex, colIndex]).Font.Bold = true;
excel.Cells[rowIndex, colIndex++] = col.ColumnName;
}
foreach (DataRow row in ds.Tables[sheetIndex].Rows)
{
rowIndex++;
colIndex = 1;
foreach (DataColumn col in ds.Tables[sheetIndex].Columns)
{
if (col.DataType == System.Type.GetType("System.DateTime"))
{
if (!"".Equals(row[col.ColumnName].ToString()))
excel.Cells[rowIndex, colIndex] = (Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("MM/dd/yyyy");
else
excel.Cells[rowIndex, colIndex] = "";
}
else if (col.DataType == System.Type.GetType("System.String"))
{
excel.Cells[rowIndex, colIndex] = "'" + row[col.ColumnName].ToString();
}
else
{
excel.Cells[rowIndex, colIndex] = row[col.ColumnName].ToString();
}
colIndex++;
}
}
Range allDataWithTitleRange = xSt.get_Range(excel.Cells[1, 1], excel.Cells[rowIndex, colIndex - 1]);
allDataWithTitleRange.Select();
allDataWithTitleRange.Columns.AutoFit();
allDataWithTitleRange.Borders.LineStyle = 1;
}
string exportDir = "~/Attachment/";
string absFileName = HttpContext.Current.Server.MapPath(System.IO.Path.Combine(exportDir, fileName));
xBk.SaveCopyAs(absFileName);
xBk.Close(false, null, null);
excel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);
System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt); xBk = null;
excel = null;
xSt = null;
GC.Collect();
}
catch (Exception ex)
{ }
}
上面方法,首先形成一个多个DataTable的DataSet,
重点还是,1. 生成一个新的xls时,打开方式,总是会提示进程占用,就像楼上说的那样
2. 用不同的sheet时一定要命名
3. 使用传入一个datatable时,总是会重写第一个sheet
谨供大家参考