客户端调用服务器端的excel模板,并向此excel中特定的单元格中写入数据,最后将这个excel文件保存在客户端机器上或打印,而服务器端excel模板不变

springbell 2009-09-02 01:20:26
bs模式,vs2005,sql2000
工作中遇到一个难题,向大家请教:
我想自己先做好excel模板,比如说sheet1中,主要是设置好表头、第一列、以及表的底部的各种格式,(由于要求在一张A4纸中,做2个表(每个表都有自己特定的表头,表的格式),所以无法使用水晶报表),excel文件叫myexcel.xls,然后将此文件放到服务器的某个文件夹下,当然可以是网站文件下的一个文件夹内。
客户端通过浏览器选择一些查询条件,然后点击一个按钮,客户端就可以完成保存此excel文件或者直接打印的功能。这个过程中我会根据查询条件,从sqlserver数据库中读取到符合要求的数据,并写入到此excel文件中的特定单元格里,单元格是固定的,比如说A4或者G12等等,从而使客户端保存的是带有数据的excel文件。
完成上述操作后,服务器端得excel文件还是模板文件,没有详细数据,只是和最开始的一样,含有各种格式。

网上搜了好久,一直没有找到合适的例子,都是些琐碎不全的东西,帮助不大
不知道大家有没有做过类似的功能,望高手不吝赐教,最好给出例子,谢谢各位。

注:
公司内部开发,局域网使用,主要是为各部门会计提供个好的平台,方便数据交互
不用考虑多个客户端同时操作这个excel模板,要求不高,不用考虑并发
保持excel模板文件不变是为了满足各部门会计能反复调用
...全文
1535 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhzhiy_cate 2009-11-25
  • 打赏
  • 举报
回复
17楼的高手,DownLoad.aspx这个页面的代码有哇?可以共享一下不?先谢谢了!
llsen 2009-09-02
  • 打赏
  • 举报
回复
17楼的就是完整的代码啊,
string TemplatePath = Server.MapPath(@"Template\Third.xls");
string ExportPath = Server.MapPath("") + @"\ExportReports";

if (!Directory.Exists(ExportPath))
{
Directory.CreateDirectory(ExportPath);
}

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();

if (app == null)
{
return;
}
app.Visible = false;
app.UserControl = true;

Microsoft.Office.Interop.Excel.Workbooks workbooks = app.Workbooks;
Microsoft.Office.Interop.Excel._Workbook workbook = workbooks.Add(TemplatePath);
就是打开模板


for (; i <= dt.Rows.Count; i++)
{
int j = 0;
worksheet.Cells[i + 2, ++j] = dt.Rows[i - 1]["Month"].ToString().Trim();
就是循环写数据


workbook.SaveAs(strExportPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

就是保存到另外一个地方

这些代码都是运行过得,可以运行
springbell 2009-09-02
  • 打赏
  • 举报
回复
来个.aspx.cs的页面代码,从头到尾的 - -!
完整的,你自己通过测试的,也好帮助有相同问题的朋友。
我相信很多朋友也应该遇到过的。
按照上面的要求只要你调用模板(G盘下的一个文件:test.xls),在一个固定单元格里写入随便一个数据,比如说B6单元格里写入100
然后能有保存提示框,把完成的新xls文件 保存到F盘下就可以了

拜托葛优靓仔了
llsen 2009-09-02
  • 打赏
  • 举报
回复
什么问题 那 还有?
llsen 2009-09-02
  • 打赏
  • 举报
回复
dll已经发送到你邮箱

Missing要添加医用
using System.Reflection;

 #region 导出到excel
/// <summary>
/// 导出到excel
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
protected void btnExportExcel_Click(object sender, EventArgs e)
{
try
{
System.Data.DataTable dt = dtSource;
string TemplatePath = Server.MapPath(@"Template\Third.xls");
string ExportPath = Server.MapPath("") + @"\ExportReports";

if (!Directory.Exists(ExportPath))
{
Directory.CreateDirectory(ExportPath);
}

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();

if (app == null)
{
return;
}
app.Visible = false;
app.UserControl = true;

Microsoft.Office.Interop.Excel.Workbooks workbooks = app.Workbooks;
Microsoft.Office.Interop.Excel._Workbook workbook = workbooks.Add(TemplatePath);
Microsoft.Office.Interop.Excel.Sheets sheets = workbook.Worksheets;
Microsoft.Office.Interop.Excel._Worksheet worksheet = (Microsoft.Office.Interop.Excel._Worksheet)sheets.get_Item(1);

if (worksheet == null)
{
return;
}

int i = 1;

for (; i <= dt.Rows.Count; i++)
{
int j = 0;
worksheet.Cells[i + 2, ++j] = dt.Rows[i - 1]["Month"].ToString().Trim();
string str = DateTime.Now.ToString("yyyyMMddHHmmss");
string strExportPath = ExportPath + @"\" + str + ".xls";

workbook.SaveAs(strExportPath, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

app.Quit();

app = null;

Response.Redirect("DownLoad.aspx?Path=" + strExportPath, false);
}
catch
{
Response.Write("<script>alert('导出失败!!')</script>");
return;
}
}
#endregion



springbell 2009-09-02
  • 打赏
  • 举报
回复
book=(Excel._Workbook)app.Workbooks.Open(strPath,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value, 
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);

3楼的这句里面很多的Missing是什么?
编译器错误信息: CS0103: 当前上下文中不存在名称“Missing”
用了什么命名空间么
springbell 2009-09-02
  • 打赏
  • 举报
回复
邮箱:spring_bell@163.com
是实例么?
llsen 2009-09-02
  • 打赏
  • 举报
回复
我有这个,你要要的话,可以发你一个
llsen 2009-09-02
  • 打赏
  • 举报
回复
Microsoft.Office.Interop.Excel

是有些版本的excel里面没有的,我当时用得迷你版就没有这个,后来去别人那里copy了一个过来用
springbell 2009-09-02
  • 打赏
  • 举报
回复
能否给个简单的例子,只要是满足上面的要求,多简单都无所谓,全面一点的好
朦胧
springbell 2009-09-02
  • 打赏
  • 举报
回复
操作步骤:网站--添加引用--.net
在.net里面,我唯一有的与excel有关的只有Microsoft.Office.Tools.Excel
并没有看到你说的Microsoft.Office.Interop.Excel
如果采用您说的方法,会报错。
编译器错误信息: CS0118: “System.Web.UI.Page.Application”是“属性”,但此处被当做“类型”来使用。红色出错行
Excel.Application app = new Application();
lfywy 2009-09-02
  • 打赏
  • 举报
回复
学习,UP
springbell 2009-09-02
  • 打赏
  • 举报
回复
谢谢偶像,我好好研究下
阿泰 2009-09-02
  • 打赏
  • 举报
回复
引用.Net组件Microsoft.Office.Interop.Excel而不是COM组件

这样就可以用到Microsoft.Office.Interop.Excel.Application
为了方便,可以使用Namespace别名简化操作
using Excel=Microsoft.Office.Interop.Excel;
这样就可以直接用Excel.Application了

仅针对语法行做说明,没有实际调试。

另外就是赞成楼上各位所说的,就是保持一个模板,使用的时候拷贝一份到某位置进行操作。
springbell 2009-09-02
  • 打赏
  • 举报
回复

Excel.Application app=new Application();

这句就开始报错了,我装的是office 2003.引用了microsoft excel 11.0 object library后,一点反应都没
using Excel;
根本不起作用
编译器错误信息: CS0246: 找不到类型或命名空间名称“Excel”(是否缺少 using 指令或程序集引用?)
springbell 2009-09-02
  • 打赏
  • 举报
回复
3楼能加些注释吗?谢谢,我的数据都是从datatable中出来的
springbell 2009-09-02
  • 打赏
  • 举报
回复
谢谢大家的帮助,仔细看看先,没问题就结贴
xingjunli 2009-09-02
  • 打赏
  • 举报
回复
因为模版要做open操作,建议复制模版为一个新文件(通过GUID命名已保证不会重复),这样每次操作是一个单独的Application已保证不会冲突,数据导入完成后将新文件发送到客户端,完成后文件是否删除视情况而定
我是这么弄的并发测试效果也还不错
wuyq11 2009-09-02
  • 打赏
  • 举报
回复
复制模板到其他文件夹,打开模板写入数据。再打开
public void INSERT_NLAExcel(DataView dvs,string strPath,string Name)
{
string s="";
Excel.Application app=new Application();
Excel._Workbook book;
Excel._Worksheet sheet;
book=(Excel._Workbook)app.Workbooks.Open(strPath,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,
Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value,Missing.Value);
sheet=(Excel._Worksheet)book.Sheets[1];
Excel.Range ran1=app.ActiveCell;
ran1=sheet.get_Range(sheet.Cells[1,1],sheet.Cells[1,9]);
ran1.Value2=Name;
for(int i=0;i<dvs.Count;i++)
{
try
{
sheet.Cells[i+4,"A"]=""; }
catch(Exception ex)
{
HttpContext.Current.Response.Write("<script language='javascript'>alert('"+ex.Message+"')</script>");
book.Close(null,null,null);
app.Workbooks.Close();
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
sheet=null;
book=null;
app=null;
GC.Collect();
HttpContext.Current.Response.Write("<script language='javascript'>alert('导出失败!')</script>");
return;
}

}
book.Save();
book.Close(null,null,null);
app.Workbooks.Close();
app.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
System.Runtime.InteropServices.Marshal.ReleaseComObject(book);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
sheet=null;
book=null;
app=null;
GC.Collect();
GC.Collect();
GC.Collect();
HttpContext.Current.Response.Write("<script language='javascript'>alert('导出成功!')</script>");
HttpContext.Current.Response.Write("<script language='javascript'>window.open('../Template_temp/A.xls','_bank')</script>");
}
llsen 2009-09-02
  • 打赏
  • 举报
回复
去年不太会用水晶报表导出数据的时候,就用的这种模板导出excel。
加载更多回复(1)

4,816

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 图表区
社区管理员
  • 图表区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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