0

これはC#での最初のコンソールアプリケーションプロジェクトであり、Excelシートの使用済み領域を2次元配列にインポートしようとしています。これはこれを行うための最も効率的な方法ではないかもしれませんが、これは私がこれまでに持っているコードです。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Reflection; 

Excel.Application excelApp = new Excel.Application();
        excelApp.Visible = true;
        string workbookPath = "C:/Users/Snuge/Desktop/CourseNumbersNoWSReg.xlsx";
        Excel.Workbook excelWorkbook = excelApp.Workbooks.Open(workbookPath,
                0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
                true, false, 0, true, false, false);

        // This selectes the used range of the excel workbook and enters it in
        // a two dimentional array
        try
        {
            // Get a reference to the first sheet of the workbook.
            Excel.Sheets excelSheets = excelWorkbook.Worksheets;
            string currentSheet = "Sheet1";
            Excel.Worksheet excelWorksheet = (Excel.Worksheet)excelSheets.get_Item(currentSheet);

            // write out to console for debugging
            Console.WriteLine("excelWorksheet is " + excelWorksheet);

            // Get a range of data.
            Excel.Range excelCell = (Excel.Range)excelWorksheet.get_Range("A3", Missing.Value);

            // write out to console for debugging
            Console.WriteLine("excelCell is " + excelCell);

            // write out to console for debugging
            Console.WriteLine("Creating string[,] array. . . ");
            // Retrieve the data from the range.
            Object[,] dataArray;
            // write out to console for debugging
            Console.WriteLine("String[,] array created. . . ");

            dataArray = (System.Object[,])excelCell.get_Value(Missing.Value);

            // write out to console for debugging
            Console.WriteLine("Counting rows and columns. . . ");
            // Determine the dimensions of the array.
            int iRows;
            int iCols;
            iRows = dataArray.GetUpperBound(0);
            iCols = dataArray.GetUpperBound(1);

            // write out to console for debugging
            Console.WriteLine("Printing array. . . ");
            // Print the data of the array.
            for (int rowCounter = 1; rowCounter <= iRows; rowCounter++)
            {
                // write out to console for debugging
                Console.WriteLine("row " + rowCounter);
                for (int colCounter = 1; colCounter <= iCols; colCounter++)
                {

                    // Write the next value to the console.
                    Console.WriteLine("col " + colCounter + "= " + dataArray[rowCounter, colCounter].ToString() + ", ");
                }
                // Write in a new line.
                Console.WriteLine("\n");
            }                
        }

        catch (Exception theException)
        {
            // Create error message
            String errorMessage;
            errorMessage = "Error: ";
            errorMessage = String.Concat(errorMessage, theException.Message);
            errorMessage = String.Concat(errorMessage, " Line: ");
            errorMessage = String.Concat(errorMessage, theException.Source);
            // Display error message
            MessageBox.Show(errorMessage, "Error");
        }

Console.Writeline();を挿入しました。デバッグ目的で。正しいExcelブックが開き、コマンドプロンプトで取得した出力は次のようになります。

excelWorksheet is System.__ComObject 
excelCell is System.__ComObject 
Creating string[,] array. . . 
String[,] array created. . .

次に、メッセージボックスにメッセージが表示されます

"Error: Cannot convert type 'string' to object[*,*] Line: Anonymously Hosted DynamicMethods Assembly".    

このコード行はエラーを表示しますが、理由はわかりません。

dataArray = (System.Object[,])excelCell.get_Value(Missing.Value);

誰かが私にこの問題の解決策を提供してもらえますか?

また、コマンドプロンプトで「System .__ ComObject」の代わりに値を表示するコードはありますか?

Excel 2007を使用していて、MicrosoftExcel12.0オブジェクトライブラリリファレンスを追加しました。

4

2 に答える 2

1

使えると思います

// This value "should" be boxed into two-dimensional array
object dataArray = excelCell.Value;

また

var dataArray = (object[,])excelCell.Value2;
于 2012-04-12T08:52:10.827 に答える
0

エラーはすべてを示しています。文字列型の値 (明らかにセル内のデータ) を 2 次元配列に変換できません。なんでそんなキャストしようとするの?単一のセルを読み取る場合、配列は必要ありません。ただし、範囲に複数のセルが含まれている場合、返される結果は実際には2次元配列になります。

次に、次のようなものが必要です。

object[,] result;
object rawData = excelCell.get_Value(Missing.Value);
if(rawData.GetType().IsArray())
{
    result = rawData;
}
else
{
    result = CreateArrayFromValue(rawData);
}

return result;

もちろん、自分で実装する必要がありCreateArrayFromValueます。

于 2012-04-12T08:53:28.367 に答える