1

Excel ファイル内のワークシートをループして、UsedRangeクリップボードにコピーし、テキスト ファイルに貼り付けようとしているこの小さな C# コードがあります。

これまでのコードはエラーをスローすることなく動作しているように見えますが、何らかの理由でテキスト ファイルに何も書き込まれません。何か不足していますか?そしてSystem.Reflection.Missing.Value、 Copy メソッドのパラメーターとして を含めても、何も起こりません。

これが私のコードです:

using (StreamWriter sw = File.CreateText("ExtractedText.txt"))
{
     foreach (Excel.Worksheet sheet in thisWkBook.Worksheets)
     {
         sheet.UsedRange.Copy();
         sw.Write(Clipboard.GetText());
     }                    
}

編集 #1:新しい C# プロジェクトを作成すると、Haxx によって提案されたコードが機能するため、私の小さなアプリで何らかの参照が壊れたに違いないと思います。しかし、Haxx の同じコードを使用して、小さなアプリに新しいメソッドとして挿入すると、まったく同じ「使用」ライブラリが呼び出されたまったく同じコードであるにもかかわらず、機能しません...アプリ全体をやり直し、コードの最も重要な部分をコピーして貼り付け、これで問題が解決したかどうかを報告します。

編集#2:問題が何であるかを理解したと思います。System.ComponentModel.BackgroundWorkerこの小さなプロセスを実行するときに進行状況バーを表示できるように、BackgroundWorker () を使用していることを忘れていました。どうやら STAThread からのみクリップボードにアクセスできるようです ( Clipboard.GetText は null (空の文字列) を返します)。そこで、BackgroundWorkers をまったく使用しない別のメソッドを作成して、STAThread で実行するようにしました。コードは正しく機能していますが、BackgroundWorker スレッドから非同期で呼び出すと、クリップボードにアクセスしようとしても機能しません。

4

1 に答える 1

2

最初のシートにセル A1 = 'a'、B1 = 'b'、A2 = 'c'、B2 = 'd' の値が含まれる Excel ファイルを作成しました。

コードは次のように単純化されています。

        Application appExl = new Application();
        Workbook workbook;

        //Opening Excel file(myData.xlsx)
        workbook = appExl.Workbooks.Open(
            @"c:\apps\book1.xlsx",
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value,
            Missing.Value);


        Worksheet sheet = workbook.Sheets.get_Item(1);
        sheet.UsedRange.Copy();
        var a = Clipboard.GetText();

a には "a\tb\r\nc\td\r\n" が含まれるようになりました

于 2013-01-25T21:13:41.757 に答える