高分求ASP.NET中用COM组件导出Excel源代码,并且是基于模板的

yuji821 2010-11-23 08:58:18
就实现以下要求就可以了

是Office 2003,有现成的模板,把一个DataTable中的数据导出到Excel的一个sheet中,不要任何样式(包括行高)那些东西,就直接把一个DataTable中的数据导出Excel中的一个Sheet中就可以了


在网上找了一大堆,感觉乱七八糟的,没有适合自己的,我就要以上要求就可以了



请给我完整源代码,包括资源释放,进程回收,我只要复制过来,不要任何修改就可以用了

只要问题解决,马上给分

...全文
177 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2010-11-26
  • 打赏
  • 举报
回复
/// <summary>
/// 将DataTable数据写入Excel文件(套用模板并分页)
/// </summary>
/// <param name="dt">DataSet集合,里面的表个数必须和sheetName数组相等</param>
/// <param name="rows">每个WorkSheet写入多少行数据</param>
/// <param name="top">行索引</param>
/// <param name="left">列索引</param>
/// <param name="isRrwriteColumn">是否重写列名</param>
/// <param name="sheetName">WorkSheet名字,必须和DataSet集合里面的DataTable个数对应</param>
public void DataTableToExcel(DataSet ds, int rows, int top, int left, bool isRrwriteColumn, params string[] sheetName)
{
int tableCount = ds.Tables.Count;
if (tableCount != sheetName.Length)
{
throw new Exception("DataTable个数和WorkSheet不匹配");
}
DateTime beforeTime;
DateTime afterTime;

//创建一个Application对象
beforeTime = DateTime.Now;
Excel.Application app = new Excel.ApplicationClass();
app.Visible = false;
afterTime = DateTime.Now;

//打开模板文件
Excel.Workbook workBook = app.Workbooks._Open(templetFile, missing, missing, missing, missing, missing,
missing, missing, missing, missing, missing, missing, missing);

Excel.Worksheet sheet = null;
for (int i = 1; i < tableCount; i++)
{
((Excel.Worksheet)workBook.Worksheets.get_Item(i)).Copy(missing, workBook.Worksheets[i]);
}

#region 将源DataTable数据写入Excel
DataTable dt = null;
for (int i = 1; i <= tableCount; i++)
{
dt = ds.Tables[i - 1];
int iRows = dt.Rows.Count, iCols = dt.Columns.Count;
//获取要写入数据的WorkSheet对象,并重命名
sheet = (Excel.Worksheet)workBook.Worksheets.get_Item(i);
sheet.Name = sheetName[i - 1];
if (isRrwriteColumn)
{
for (int k = 0; k < iCols; k++)
{
sheet.Cells[1, left + k] = dt.Columns[k].ColumnName;
}
}

object[,] dataArray = new object[iRows, iCols];
for (int j = 0; j < iRows; j++)
{
for (int k = 0; k < iCols; k++)
{
dataArray[j, k] = dt.Rows[j][k];
}
}
//将dt中的数据写入WorkSheet
sheet.get_Range(sheet.Cells[top, left], sheet.Cells[iRows, iCols]).Value2 = dataArray;
}
#endregion

#region 输出Excel文件并退出
try
{
workBook.SaveCopyAs(outputFile);
//workBook.SaveAs(outputFile, missing, missing, missing, missing, missing, Excel.XlSaveAsAccessMode.xlExclusive,
// missing, missing, missing, missing, missing);
workBook.Close(false, null, null);
app.Workbooks.Close();
app.Application.Quit();
app.Quit();

System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workBook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);

sheet = null;
workBook = null;
app = null;

GC.Collect();
}
catch (Exception e)
{
//throw e;
}
finally
{
Process[] myProcesses;
DateTime startTime;
myProcesses = Process.GetProcessesByName("Excel");

//得不到Excel进程ID,暂时只能判断进程启动时间
foreach (Process myProcess in myProcesses)
{
startTime = myProcess.StartTime;

if (startTime > beforeTime && startTime < afterTime)
{
myProcess.Kill();
}
}
}
#endregion
}
yuji821 2010-11-25
  • 打赏
  • 举报
回复
vvvvvvvvvvvv
  • 打赏
  • 举报
回复
你给个邮箱, 我把那段发给你
yuji821 2010-11-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 huxinzheng690396467 的回复:]
你给个邮箱, 我把那段发给你
[/Quote]

yuji2008#126.com

发送时把#改成@,你一定要发符合我的要求的,不要发一大堆过来
yuji821 2010-11-24
  • 打赏
  • 举报
回复
只要符合要求,代码可用,立马给分

62,272

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧