多用户同时通过Excel生成报表的问题

xuefeng_zzg 2014-03-11 02:52:47
最近开发出的项目碰到了一个问题,在程序中如果的当个用户即自己调试是没有问题的,但是当多个用户同时执行的话就出现了数据无法访问的问题。请大家帮帮忙,看看可以怎么改。
主要代码如下

public void GetURL(Reprots reprotsInfo)
{
if (Session["FileName"] != null)
{
string oldfileName = Session["FileName"].ToString();
string oldxlsPath = Server.MapPath("~/DownLoad/" + oldfileName);
//保存Excel单网页格式的文件路径
string oldhtmlPath = oldxlsPath.Replace(".xls", ".mht");
FilePicDelete(oldhtmlPath);
FilePicDelete(oldxlsPath);
}

SpreadsheetGear.IWorkbookSet workbookSet = SpreadsheetGear.Factory.GetWorkbookSet(System.Globalization.CultureInfo.CurrentCulture);
SpreadsheetGear.IWorkbook workbook = workbookSet.Workbooks.OpenFromMemory(reprotsInfo.ReportContent);
SpreadsheetGear.IWorksheet worksheet = workbook.Worksheets[0];
//向Excel中添加单元格和图形的填充数据
GetConfigData(workbook, reprotsInfo.ReportID);
//把当前的Excel转为二进制
Byte[] reportContent = workbook.SaveToMemory(SpreadsheetGear.FileFormat.Excel8);
//保存文件名
string fileName = Session["Account"].ToString() + reprotsInfo.ReportName + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls";
Session["FileName"] = Session["Account"].ToString() + reprotsInfo.ReportName + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls"; ;
//保存Excel文件路径
string xlsPath = Server.MapPath("~/DownLoad/" + fileName);
//保存Excel单网页格式的文件路径
string htmlPath = xlsPath.Replace(".xls", ".mht");
//设置当前的Excel的保存路径
FileStream fs = new FileStream(xlsPath, FileMode.Create);
//保存当前Excel文件
fs.Write(reportContent, 0, reportContent.Length);
//清除缓存
fs.Flush();
//关闭Excel文件
fs.Close();
//删除老的Excel单网页文件
FilePicDelete(htmlPath);
//生成新的Excel单网页文件
ExcelConvertToHtml(xlsPath, htmlPath);
//把新的Excel单网页文件显示到页面上
System.IO.FileInfo file = new System.IO.FileInfo(htmlPath);
if (file.Exists)
{
this.Panel2.IFrameUrl = "/DownLoad/" + fileName.Replace(".xls", ".mht");
}
}

我生成报表的原理是先从数据库中获得Excel的模板,然后把配置数据填入相应的单元格,生成Excel文件形式的报表,然后把该Excel另存为.mht形式,最后再把它嵌入网页中。
...全文
234 11 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
新页小星 2014-03-17
  • 打赏
  • 举报
回复
如果是客户端的话,柱状图、曲线图用EasyUI好像可以,你试一下
xuefeng_zzg 2014-03-17
  • 打赏
  • 举报
回复
我用excel最关键的是用它的柱状图、曲线图之类的东西,在网上也没找到web端可以支持显示excel图形的控件。所以我想了这样一个蛋疼的办法。
踏平扶桑 2014-03-17
  • 打赏
  • 举报
回复
不如换个思路
把数据从数据库返回到客户端,然后在客户端生成报表格式(Jquery来生成表格什么的。)
md5e 2014-03-17
  • 打赏
  • 举报
回复
static object _lock=new object(); public void GetURL(Reprots reprotsInfo) { lock(_lock){ if (Session["FileName"] != null) { string oldfileName = Session["FileName"].ToString(); string oldxlsPath = Server.MapPath("~/DownLoad/" + oldfileName); //保存Excel单网页格式的文件路径 string oldhtmlPath = oldxlsPath.Replace(".xls", ".mht"); FilePicDelete(oldhtmlPath); FilePicDelete(oldxlsPath); } SpreadsheetGear.IWorkbookSet workbookSet = SpreadsheetGear.Factory.GetWorkbookSet(System.Globalization.CultureInfo.CurrentCulture); SpreadsheetGear.IWorkbook workbook = workbookSet.Workbooks.OpenFromMemory(reprotsInfo.ReportContent); SpreadsheetGear.IWorksheet worksheet = workbook.Worksheets[0]; //向Excel中添加单元格和图形的填充数据 GetConfigData(workbook, reprotsInfo.ReportID); //把当前的Excel转为二进制 Byte[] reportContent = workbook.SaveToMemory(SpreadsheetGear.FileFormat.Excel8); //保存文件名 string fileName = Session["Account"].ToString() + reprotsInfo.ReportName + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls"; Session["FileName"] = Session["Account"].ToString() + reprotsInfo.ReportName + DateTime.Now.ToString("yyyyMMddhhmmss") + ".xls"; ; //保存Excel文件路径 string xlsPath = Server.MapPath("~/DownLoad/" + fileName); //保存Excel单网页格式的文件路径 string htmlPath = xlsPath.Replace(".xls", ".mht"); //设置当前的Excel的保存路径 FileStream fs = new FileStream(xlsPath, FileMode.Create); //保存当前Excel文件 fs.Write(reportContent, 0, reportContent.Length); //清除缓存 fs.Flush(); //关闭Excel文件 fs.Close(); //删除老的Excel单网页文件 FilePicDelete(htmlPath); //生成新的Excel单网页文件 ExcelConvertToHtml(xlsPath, htmlPath); //把新的Excel单网页文件显示到页面上 System.IO.FileInfo file = new System.IO.FileInfo(htmlPath); if (file.Exists) { this.Panel2.IFrameUrl = "/DownLoad/" + fileName.Replace(".xls", ".mht"); } } }
xuefeng_zzg 2014-03-17
  • 打赏
  • 举报
回复
我知道用lock是锁,关键是锁哪里
md5e 2014-03-17
  • 打赏
  • 举报
回复
用lock(_lock){ .... }
xuefeng_zzg 2014-03-17
  • 打赏
  • 举报
回复
个人感觉是多线程方面的问题,因为对多线程不是很了解,求解答应该怎么锁
xuefeng_zzg 2014-03-12
  • 打赏
  • 举报
回复
顶。。。。。。。 求答案
xuefeng_zzg 2014-03-11
  • 打赏
  • 举报
回复
你这主要是Excel的上传下载的,和我的问题有区别
insus 2014-03-11
  • 打赏
  • 举报
回复
xuefeng_zzg 2014-03-11
  • 打赏
  • 举报
回复
求帮助。。。。。。。。。。
Crystal Reports 9.2 中文版(水晶报表) 下载,,软件版本:9.2.0.448不过现已出了Crystal Reports Professional v9.2.2.634 (c) Crystal Decisions,有足够的空间就提供.这是一个很不错的报表控件,我相信很多朋友都听说过吧!Crystal Reports 用于处理数据库,帮助用户分析和解释重要信息。使用 Crystal Reports 可以方便地创建简单报表,同时它也提供了创建复杂或专用的报表所需的整套工具。 创建所能想象的任何报表 Crystal Reports几乎可以从任何数据源生成您需要的报表。内置报表专家在您生成报表和完成一般的报表任务过程中,会一步一步地指导您进行操作。报表专家通过公式、交叉表、子报表和设置条件格式帮助表现数据的实际意义,揭示可能被隐藏掉的重要关系。如果文字和数字确实不够充分,则用地理地图和图形进行形象的信息交流。 将报表扩展到 Web Crystal Reports 的灵活性并未停留在创建报表这一功能上 ?您可以用各种各样的格式发布报表,包括用 Microsoft 的 Word 和 Excel 发布、通过电子邮件甚至 Web 发布。高级的 Web 报表功能允许工作组中的其他成员在他们自己的 Web 浏览器中查看或更新共享报表。 将报表并入应用程序通过将 Crystal Reports 的报表处理功能整合到自己的数据库应用程序中,应用程序和 Web 开发人员可以节省开发时间并满足用户的需求。Crystal Reports 支持大多数流行的开发语言,可以方便地在任何应用程序中添加报表。 不论您是 IT 行业的站点管理员,还是营销推广经理,也无论您是金融业的数据库管理员还是 CEO,Crystal Reports 都堪称是一个功能强大的工具,它可以帮助每一个人分析、解释重要信息。感谢 revenant 上传!

62,243

社区成员

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

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

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

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