2

Excelスプレッドシートのすべてのセル値を2D配列に変換するメソッドを作成する人が必要です。

Excelで動作するようにC#のリボンを使用して作成していますが、動作させることができません。

  private string[,] GetSpreadsheetData () 
  {
        try
        {
            Excel.Application exApp =
            Globals.TSExcelAddIn.Application as Excel.Application;
            Excel.Worksheet ExWorksheet = exApp.ActiveSheet as Excel.Worksheet;
            Excel.Range xlRange = ExWorksheet.get_Range("A1","F188000");

            object[,] values = (object[,])xlRange.Value2;
            string[,] tsReqs = new string[xlRange.Rows.Count, 7];
            char[] alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();

            for (int i = 0; i < tsReqs.GetLength(0); i++)
            {
                for (int z = 0; z < tsReqs.GetLength(1); z++)
                {
                    if(values[i+1,z+1] != null)
                        tsReqs[i, z] = values[i + 1, z + 1].ToString();
                }
            }
            return tsReqs;
        }

        catch
        {
            MessageBox.Show
                ("Excel has encountered an error. \nSaving work and exitting");
            return null;
        }
    }

また、誰かがこれを行うためのより効率的な方法を持っているなら、私はそれを大いに感謝します。

            Excel.Range xlRange = ExWorksheet.get_Range("A1","F188000");

A1からF188000セルまでずっと読み取ります。データがまったくない行に到達するまで、読み取りを続けたいだけです。

   -        Caught: "Index was outside the bounds of the array." (System.IndexOutOfRangeException)  Exception Message = "Index was outside the bounds of the array.", Exception Type = "System.IndexOutOfRangeException"    
4

4 に答える 4

4

ExWorksheet.UsedRange代わりに使用することを検討できますExWorksheet.get_Range("A1","F188000")

編集:また、範囲の.Textフィールドを使用する場合、値は自動的に文字列にキャストされるため、ここで.Value2を使用する必要はないと思います。

Excel.Range rng = ExWorksheet.UsedRange;
int rowCount = rng.Rows.Count;
int colCount = rng.Columns.Count;

string[,] tsReqs = new string[rowCount, colCount];

for (int i = 1; i <= rowCount; i++)
{
    for (int j = 1; j <= colCount; j++)
    {
        string str = rng.Cells[i, j].Text;
        tsReqs[i - 1, j - 1] = str;
    }
}
于 2013-01-16T22:13:14.380 に答える
0

これを試して

    private static void printExcelValues(Worksheet xSheet)
    {
        Range xRng =xSheet.Cells.SpecialCells(
            XlCellType.xlCellTypeConstants);
        var arr = new string[xRng.Rows.Count,xRng.Columns.Count];
        foreach (Range item in xRng)
        {
            arr[item.Row-1,item.Column-1]=item.Value.ToString();
        }
    }

|を使用できます XlCellType.xlCellTypeFormulasなどのセルタイプやその他の任意のタイプを指定します。

于 2013-01-16T21:57:19.453 に答える
0

アレイのサイズは異なります。値A1:F188000は6列から取得されますが、7列の列をループしていtsReqsます。1ベースの配列になるという事実を説明しようとしているようですがvalues、それを適切に説明していません。

の宣言を次のように変更tsReqsします。

string[,] tsReqs = new string[xlRange.Rows.Count, 6];

そして、あなたは元気でなければなりません。

于 2013-01-16T22:02:31.497 に答える
0

私は非常に似たようなことをしなければなりませんでした。Excelファイルの読み取りには時間がかかります...別のルートを使用しましたが、すぐに結果が得られました。

まず、各列に独自の配列を指定しました。スプレッドシートの各列をCSV(カンマ区切り)ファイルとして保存しました。そのファイルをnotePadで開いた後、コンマで区切られた942個の値を配列の初期化にコピーすることができました。

int[] Column1 = {300, 305, 310, ..., 5000};
                 [0]  [1]  [2]  ...  [941]

さて...各列に対してこれを行うと、位置は「スプレッドシート」の各「列」の「行」に似たものになります。

ユーザー入力サイズをスプレッドシートの「幅」列の値と比較して、スプレッドシートで見つかったそれぞれのサイズに関する情報を取得する必要があったため、この奇妙な方法は私にとって完璧に機能しました。

注:セルに私のような整数ではなく文字列が含まれている場合は、列挙メソッドを使用できます。

enum column1 { thing_1, thing_2, ..., thing_n,}
                 [0]      [1]           [n]  

これが私のコードです:(これはスプレッドシートをいくつかの配列に変換するコードではありません-列の数に応じて数行のコードです-これは私が書いたLookUpメソッド全体です)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace PalisadeWorld
{   
//struct to store all the positions of each matched panel size in an array 'Identities'
struct ID
    {
        public int[] Identities;
        public ID(int[] widths, int rows)
        {   
            //Column1 from spreadsheet
            int[] allWidths = { 300, 305, 310, 315, 320, 325, 330, ..., 5000 };
            int i,j;
            int[] Ids = new int[rows];

            for (i = 0; i < rows; i++)
            {
                for (j = 0; j < 941; j++)
                {
                    if (widths[i] == allWidths[j])
                    {
                        Ids[i] = j;
                        break;
                    }
                }
            }
            this.Identities = Ids;
        }
        public override string ToString()
        {
            string data = String.Format("{0}", this.Identities);
            return data;
        }
    }

class LookUpSheet
{   
    //retrieve user input from another class
    public int[] lookUp_Widths {get; set;}
    public int lookUp_Rows { get; set; }

    //Method returning desired values from Column2
    public int[] GetNumPales1()
    {
        //column2
        int[] all_numPales = { 2, 2, 2, 2, 2, 2, 2, 2, 2, ..."goes on till [941]"...};
        int[] numPales = new int[lookUp_Rows];

        ID select = new ID(lookUp_Widths, lookUp_Rows);

        for (int i = 0; i < lookUp_Rows; i++)
        {
            numPales[i] = all_numPales[select.Identities[i]];
        }

        return numPales;
    }
    //Method returning desired values from Column3
    public int[] GetBlocks1()
    {
        //column3
        int[] all_blocks = { 56, 59, 61, 64, 66, 69, 71, 74, "goes on till [941]"...};
        int[] blocks = new int[lookUp_Rows];

        ID select = new ID(lookUp_Widths, lookUp_Rows);

        for (int i = 0; i < lookUp_Rows; i++)
        {
            blocks[i] = all_blocks[select.Identities[i]];
        }
        return blocks;
    }

..。

スプレッドシートの各列に進みます

これが誰かに役立つことを本当に願っています。乾杯

于 2013-03-06T14:03:23.107 に答える