0

私は、Excel ファイルのデータを読み取り、それをデータベースに入れるこのプログラムに取り組んでいます。このプログラムは C# を使用して Visual Studio 2010 で作成されており、NPOI ライブラリを使用しています。

以前は、スプレッドシートを行ごと、セルごとに読み取ってデータを取得できましたが、Excel ファイルの新しい形式では、これを簡単に行うことはできません。(エクセルは別のユーザーから譲り受けたものなので、大きな変更はできません)。

1 つのシートにいくつかの「テーブル」があり (各列名に境界線とヘッダーを使用)、主にテーブルからデータを取得する必要がありますが、テーブルの外にあるデータも取得する必要があります。

スプレッドシートを 1 行ずつ読む必要があるかどうか疑問に思っていました (これは私が少し慣れていることです)。表に到達したことを確認する方法はありますか? セルの「フォーマット」を読み取る方法はありますか?

私が言いたいのは、たとえば、「このセルには境界線があるので、この行の開始はテーブルです。」または「このセルのテキストは太字なので、この行はこの新しいテーブルのヘッダー行です。

以前は、スプレッドシートの「テキスト」しか読み取れず、形式やスタイルは読み取れませんでした。私はインターネットで検索してきましたが、出力Excelのスタイルを設定する方法しか見つかりませんが、入力からフォーマットを読み取る方法は見つかりません。

どんな助けでも大歓迎です、ありがとう!

4

1 に答える 1

2

ソース ワークブック内のさまざまなテーブルを、既知の名前を持つ名前付き範囲として定義することをお勧めします。次に、次のように関連する領域を取得できます-

using System.IO;
using System.Windows;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

// ...
        using (var file = new FileStream(workbookLocation, FileMode.Open, FileAccess.Read))
        {
          var workbook = new XSSFWorkbook(file);
          var nameInfo = workbook.GetName("TheTable");
          var tableRange = nameInfo.RefersToFormula;
          // Do stuff with the table
        }

ソーススプレッドシートを制御できず、テーブルを名前付き範囲として定義できない場合は、提案どおりにセル形式を読み取ることができます。TopBorder スタイルを読み取る例を次に示します -

        using (var file = new FileStream(workbookLocation, FileMode.Open, FileAccess.Read))
        {
            var workbook = new XSSFWorkbook(file);
            var sheet = workbook.GetSheetAt(0);

            for (int rowNo = 0; rowNo <= sheet.LastRowNum; rowNo++)
            {
                var row = sheet.GetRow(rowNo);
                if (row == null) // null is when the row only contains empty cells 
                    continue;
                for (int cellNo = 0; cellNo <= row.LastCellNum; cellNo++)
                {
                    var cell = row.GetCell(cellNo);
                    if (cell == null) // null is when the cell is empty
                        continue;
                    var topBorderStyle = cell.CellStyle.BorderTop;
                    if (topBorderStyle != BorderStyle.None)
                    {
                        MessageBox.Show(string.Format("Cell row: {0} column: {1} has TopBorder: {2}", cell.Row.RowNum, cell.ColumnIndex, topBorderStyle));
                    }
                }
            }
        }
于 2014-01-20T19:09:04.180 に答える