找回密码
 立即注册

QQ登录

只需一步,快速开始

lmbosos

中级会员

2

主题

19

帖子

615

积分

中级会员

积分
615

活字格认证

最新发帖
lmbosos
中级会员   /  发表于:2012-10-23 13:57  /   查看:18601  /  回复:25
控件版本:Spread for Windows v5.0.3505
问题描述:
使用SheetView.OpenExcel(string fileName,   int excelSheetIndex)打开Excel中的sheet后,内存未释放,关闭Fpspread所在的窗口,内存仍未释放,只有在关闭应用程序后内存才会被释放。重复调用此方法,因内存未释放会导致内存溢出错误
尝试过的解决办法:
使用FpSpread.OpenExcel(Stream),未能解决

25 个回复

倒序浏览
iceman
社区贡献组   /  发表于:2012-10-23 16:17:00
沙发
回复 1楼lmbosos的帖子

内存溢出和机器配置相关,请问你的机器配置信息是?
请问你的 excel 文件有多少条数据?Stream 使用完是否 Dispose 。
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-24 12:04:00
板凳
1、机器配置如下
Intel Pentium Dual E2180 @ 2.00GHz
内存 2GB
2、使用SheetView.OpenExcel(string fileName,   int excelSheetIndex)时没有需要我自己需要Dispose的Stream;使用FpSpread.OpenExcel(Stream)时我已经成功的Dispose了该Stream。
3、Excel 文件有97个Sheet,每个Sheet中的数据一屏或两屏

我想再描述一下问题,每一次打开内存都会增加,但关闭Spread所在界面并不会减少内存占用。因此在4GB内存的机器上也测过,只要不关程序内存的占用数就不断增加直至内存耗尽。

重申一点请在Spread for Windows v5.0.3505版本中解决问题,因为我们买的只是这个版本,谢谢!
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-24 12:06:00
地板
补充一点,我搜索了论坛中关于内存溢出的相关帖子,发现出现此问题的不只我一家用户
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2012-10-24 15:06:00
5#
回复 4楼lmbosos的帖子

lmbosos 你好,
感谢反馈该问题给我们。
请问什么要一次性打开多次 Excel 呢?
我想可以通过判断文件是否可写去判断,Spread 是否加载了该 excel 文件。

  1. private void openExcelToolStripMenuItem_Click(object sender, EventArgs e)
  2.         {
  3.             string filename = "DownloadInfo.xls";
  4.             bool flag = true;
  5.             for (int i = 0; i < 2; i++)
  6.             {
  7.                 FileStream excelStream = new FileStream(filename, FileMode.OpenOrCreate, FileAccess.Read);
  8.                 if (!excelStream.CanWrite && flag)
  9.                 {
  10.                     this.fpSpread1.OpenExcel(excelStream);
  11.                     flag = false;
  12.                 }
  13.                 else
  14.                 {
  15.                     MessageBox.Show("文件已经打开");
  16.                 }
  17.             }
  18.         }
复制代码


能否提供异常信息截图(包括 Detail 部分)?
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-24 17:28:00
6#
我们的程序是支持用户操作多任务的,每打开一个任务就是创建一个包含FpSpread控件的窗体,FpSpread中的内容会从Excel文件中加载进来。 有没有什么方法可以在我实例化FpSpread后不用打开Excel,就能在FpSpread内显示Excel中包含的表内容?
回复 使用道具 举报
iceman
社区贡献组   /  发表于:2012-10-24 17:57:00
7#
回复 6楼lmbosos的帖子

请问多用户操作的是同一个 Excel 模板吗?
可以 SheetView 打开 Excel 保存为 XML 模板。
通过 SheetView.Save(filename) 方法保存为 XML 文件,在用户打开时通过代码SheetView.Open(filename) 打开该模板。
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-25 10:28:00
8#
Application Thread Exception: System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。
   在 FarPoint.Win.Spread.StyleInfo..ctor()
   在 FarPoint.Win.Spread.NamedStyleCollection..ctor()
   在 FarPoint.Win.Spread.Model.DefaultSheetStyleModel..ctor(Int32 rowCount, Int32 columnCount, ISheetStyleModel parent, NamedStyleCollection namedStyles)
   在 FarPoint.Win.Spread.SheetView.g()
   在 FarPoint.Win.Spread.SheetView..ctor()
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-25 10:31:00
9#
说明一下,用户操作的可能是相同或不同的Excel文件,且只操作Excel,而不是XML文件。

请尽可能帮助我解决问题,而不是改变业务行为,谢谢!
回复 使用道具 举报
lmbosos
中级会员   /  发表于:2012-10-25 10:33:00
10#
Application Thread Exception: System.Exception: Exception handled in FpSpread.WndProc ---> System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。
   在 FarPoint.Win.Spread.RangeGroupInfo.Clone()
   在 FarPoint.Win.Spread.DefaultRangeGroupModel.GetRangeGroupInfo(Int32 level, Boolean isRowGroup)
   在 FarPoint.Win.Spread.SheetView.GetRowVisible(Int32 row)
   在 FarPoint.Win.Spread.SheetView.GetRowHeight(Int32 row)
   在 FarPoint.Win.Spread.SheetView.o(Int32 A_0)
   在 FarPoint.Win.Spread.SpreadView.p(Int32 A_0, Int32 A_1)
   在 FarPoint.Win.Spread.SpreadView.GetViewportBottomRow(Int32 rowViewportIndex)
   在 FarPoint.Win.Spread.SpreadView.b(Int32 A_0, Int32 A_1, MouseEventArgs A_2)
   在 FarPoint.Win.Spread.SpreadView.h(MouseEventArgs A_0)
   在 FarPoint.Win.Spread.FpSpread.OnMouseMove(MouseEventArgs e)
   在 System.Windows.Forms.Control.WmMouseMove(Message& m)
   在 System.Windows.Forms.Control.WndProc(Message& m)
   在 FarPoint.Win.Spread.FpSpread.WndProc(Message& m)
   --- 内部异常堆栈跟踪的结尾 ---
   在 FarPoint.Win.Spread.FpSpread.WndProc(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   在 System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   在 System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
回复 使用道具 举报
123下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部