【问题标题】:Interop.Excel 0x800A03EC - Out of memory error code 7Interop.Excel 0x800A03EC - 内存不足错误代码 7
【发布时间】:2012-12-04 06:34:52
【问题描述】:

我正在尝试循环浏览 Excel 工作簿并将粘贴值复制到顶部 该工作簿中的每个工作表。但是我在网上遇到了一个内存问题: ws.select(true),当转到下一张表时。

遇到的错误:

来自 HRESULT 的异常:0x800A03EC: 当我此时关闭工作簿时,excel会抛出: 内存不足(错误 7)

附加信息:

文件大小为 3mb、20 个选项卡和大量从 olap 数据库 TM1 读取的数据库公式。 微软办公 2007

我正在运行的代码如下。有没有更有效的运行方法可以防止内存不足错误或者这有什么不同??

任何帮助将不胜感激!

#
    public bool wbCopyValueOnly(string workBook) 
    { 

    Workbook wb = excel.ActiveWorkbook;
    Worksheet ws;
    Range rng;

    int WS_Count = wb.Sheets.Count;
    for (int i = 0; i < WS_Count; i++)
    {
        try
        {
            ws = wb.Sheets[i + 1];
            ws.Activate();
            ws.Select(true);
            //ws.Select(Type.Missing);
            //ws.Cells.Select();
            ws.UsedRange.Select();

            //ws.Cells.Copy();
            ws.UsedRange.Copy(Type.Missing);
            ws.UsedRange.PasteSpecial(Excel.XlPasteType.xlPasteValues, Excel.XlPasteSpecialOperation.xlPasteSpecialOperationNone, false, false);
            // select of range to get around memory issue
            excel.Application.CutCopyMode = (Excel.XlCutCopyMode)0;
            //rng = ws.get_Range("A1");
            //rng.Select();
            NAR(ws);

        }
        catch (System.Runtime.InteropServices.COMException err)
        {

            cLogging.write(LogLevel.Error, err.Message);
            Debug.Print(err.Message);
            return false;
        }


    }
    NAR(wb);
    return true;

    }


    private void NAR(object o)
    {
        try
        {
            while (System.Runtime.InteropServices.Marshal.ReleaseComObject(o) > 0) ;
        }
        catch { }
        finally
        {
            o = null;
        }
    }

【问题讨论】:

  • 你可以试试office 2003和2010吗?以及来自另一台电脑?

标签: c# excel excel-interop


【解决方案1】:

我有一个程序可以从最多 100 个选项卡复制回第一个摘要页面,我发现使用 .Copy() 会导致几个问题。特别是如果您的程序运行了一段时间;当前用户无法使用复制粘贴功能而没有奇怪的结果。我建议使用变量来存储您需要的内容,然后写入预期的范围。如果您需要更改范围的格式,录制宏非常有用。

【讨论】:

    【解决方案2】:
    ws.Activate();
    ws.Select(true);
    ws.UsedRange.Select();
    

    我认为这些代码没有必要。

    您可以录制一个 Marco 来学习如何修改您的代码。

    【讨论】:

    • 值得尝试不同的环境,bonCodigo。问题是解决方案需要部署在 2007 年的环境中......
    猜你喜欢
    • 2020-08-07
    • 1970-01-01
    • 2021-10-05
    • 2013-08-21
    • 2016-07-10
    • 2012-11-23
    • 1970-01-01
    • 1970-01-01
    • 2015-09-20
    相关资源
    最近更新 更多