5

開発用 PC やその他のワークステーションで正常に動作するアプリケーションをデプロイしようとしています。ただし、一部のユーザーは、私には理解できないエラーを受け取ります。

このプログラムは、Excel.Interop 機能 (Office 2003) を備えた C# dotNet アプリです。

「インデックス」に問題があるようです。奇妙なことに、この部分は一部のマシンでは完全に機能しますが、他のマシンでは致命的な例外が発生します... すべてのマシンは Office 2003 を搭載した Windows 7 です。

これは関連するコードです:

//Change sheet code (index is 1, 2, 3) -> errors at #2
public void ChangeWorksheet(int sheetIndex)
{
    if (_OnXLSEvent != null) _OnXLSEvent(string.Format("TEMP: working on page {0}", sheetIndex));
    _WS = _WSs[sheetIndex];
    _Shapes = _WS.Shapes;
    _PageSetup = _WS.PageSetup;
    if (_OnXLSEvent != null) _OnXLSEvent(string.Format("TEMP: working on page {0}", _WS.Name));
}

//Constructor (_App and _WBs are static)
public ExcelProcessor(bool SaveAutomatically = false, string SavePath = "")
{
    if (_App == null)
        _App = new XLS.Application();
    if (_WBs == null)
        _WBs = _App.Workbooks;
    _WB = _WBs.Add();
    _WSs = _WB.Sheets;
    _WS = _WSs[1];
    _Shapes = _WS.Shapes;
    _PageSetup = _WS.PageSetup;
    _SavePath = SavePath;
    _SaveOnDispose = SaveAutomatically;
    _App.DisplayAlerts = false;
    ApplyPageSetup();
}

これは私が受け取っているログです:

... Irrelevant
8:52:   TEMP: working on page 1
8:52:   TEMP: working on page Sheet1
8:52:   TEMP: working on page 2
8:52:   Error occurred:
Invalid index. (Exception from HRESULT: 0x8002000B (DISP_E_BADINDEX))
at Microsoft.Office.Interop.Excel.Sheets.get__Default(Object Index)
at Classes.XLSInterop.ExcelProcessor.ChangeWorksheet(Int32 sheetIndex) in     c:\Users\panjaj\Documents\VS Projects\Projects\Client   Projects\ProFormaCreator\ProFormaCreator\Classes\XLSInterop\ExcelProcessor.cs:line 74
at Classes.ApplicationManager.Manager.ProcessSingleDocument(InFileDocument doc) in c:\Users\panjaj\Documents\VS Projects\Projects\Client Projects\ProFormaCreator\ProFormaCreator\Classes\ApplicationManager\ApplicationManager.cs:line 327
at Classes.ApplicationManager.Manager.ConvertFile(String File) in c:\Users\panjaj\Documents\VS Projects\Projects\Client Projects\ProFormaCreator\ProFormaCreator\Classes\ApplicationManager\ApplicationManager.cs:line 172
4

2 に答える 2

8

話すのが早すぎた!これは本当にばかげたエラーです。他の人が私と同じ罠に陥らないように、解決策を提供すると思いました;-)

問題をさらに分析するために、次のコードをコンストラクターに追加しました。

List<XLS.Worksheet> sheets = new List<XLS.Worksheet>()
foreach(XLS.Worksheet sh in _WSs)
{
    sheets.Add(sh);
}
if(_OnXLSEvent != null) _OnXLSEvent(String.Format("\n\tSheets in WB: {0}\n\tFirst Sheet index: {1}, \n\tLast Sheet index: {2}",
                                                  _WSs.Count,
                                                  sheets[0].Index,
                                                  sheets.Last().Index));

これにより、マシンに次のログが記録されました。

Sheets in WB: 3
First Sheet index: 1, 
Last Sheet index: 3

ただし、ターゲット マシンでの次のログでは、次のようになります。

Sheets in WB: 1
First Sheet index: 1, 
Last Sheet index: 1

結論: 新しいワークブックに標準で追加されるワークシートの量は、ユーザーごとに異なります。心に留めておくべきこと!

于 2013-05-31T07:24:02.080 に答える
0

ワークシートが存在しないかどうかを確認してから追加できます。通常、最初のワークシートはデフォルトで作成され、残りは以下のように確認できます。同様の問題があり、以下のように解決しました。

           // Add Worksheet 2 if not present
            if (workbook.Worksheets.Count < 2)
            {
                workbook.Worksheets.Add();
            }

            // Add Worksheet 3 if not present
            if (workbook.Worksheets.Count < 3)
            {
                workbook.Worksheets.Add();
            }
于 2016-10-17T17:09:14.280 に答える