0

set_value メソッドの使用中に問題が見つかりました。間違いを排除するために、可能な限り単純なコードを書きました。

いくつかのセルを読み取ってから、set_value を使用してシートに書き戻すと、次のようになります。

  • xlsx ファイルで任意のフィルターがアクティブになっている。

  • 2 つ以上の列が get/set であり、

一部のセルが破損しています (空であるか、#N/D のようなジャンクが含まれています)。set_value を使用する前に、ワークシートまたはプログラムでフィルタリングを無効にすると、すべて正常に動作します。Google でこの特定の問題に関する情報を見つけることができません。本当にばかげたことをしていますか?

Excel.Workbooks workbooks;
Excel.Workbook workbook = null;
Excel.Worksheet sheet = null;
Excel.Application excelApplication;
excelApplication = new Excel.Application();
excelApplication.Visible = false;
workbooks = excelApplication.Workbooks;
workbook = workbooks.OpenXML(file);
sheet = workbook.Sheets[1];

Excel.Range excelRangeR = sheet.UsedRange;
object[,] valueArrayR = (object[,])excelRangeR.get_Value(Excel.XlRangeValueDataType.xlRangeValueDefault);
//if uncomment line     below (or manualy disable filters in XLSX file), set_value works fine
//sheet.AutoFilterMode = false;
excelRangeR.set_Value(Excel.XlRangeValueDataType.xlRangeValueDefault, valueArrayR);

workbook.Save();
workbook.Close();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelRangeR);
System.Runtime.InteropServices.Marshal.ReleaseComObject(sheet);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook);
System.Runtime.InteropServices.Marshal.ReleaseComObject(workbooks);
excelApplication.Quit();
System.Runtime.InteropServices.Marshal.ReleaseComObject(excelApplication);
4

1 に答える 1

1

フィルターをオンのままにしておくことができますが、シートにアクティブなフィルターがある場合は、セルの値を設定する前に削除する必要があります。オブジェクト[、]変数を設定すると、表示されていない行を含む範囲内のすべてのデータが配列に入力されますが、範囲の値をオブジェクト[ ,] 配列の場合、表示されている行のみを上書きします。それか、その逆か。

このコードが正しくない場合は申し訳ありません。C# Interop 構文を推測しているだけです。私はそれほど頻繁にそれを使用しません。

if (sheet.get_FilterMode()) {
    sheet.ShowAllData();
}

残念ながら、ワークシート フィルターの現在の値を保存する簡単な方法はないため、貼り付け操作後にフィルターを復元できるようにする必要がある場合は困難です。

于 2013-03-29T20:16:54.200 に答える