web-dev-qa-db-ja.com

EPPLUSにテキストとして読み取らせる

私はxlsxファイルを読み取り、検証を行い、データベースに挿入するアプリケーションを開発しています。残念ながら、数値としてマークされた列(EAN-13コードのfe)を読み取ろうとすると、intの最小値が取得されます。 Excelで正しく表示されるため、ユーザーには表示されません。

ファイルをプレーンテキストとして読み取らせるにはどうすればよいですか? OLEBDを使用できることはわかっていますが、ファイルを動的に編集する必要があるため、epplusExcelPackageが最適です。

これが使用しているコードです:

 FileInfo file = new FileInfo(path);
 MainExcel = new OfficeOpenXml.ExcelPackage(file);
 {
   var ws = MainExcel.Workbook.Worksheets.First();
   DataTable tbl = new DataTable();
        for (var rowNum = 1; rowNum <= ws.Dimension.End.Row; rowNum++)      //currently loading all file
                {
                    var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
                    var row = tbl.NewRow();
                    foreach (var cell in wsRow)
                    {
                        row[cell.Start.Column - 1] = cell.Text;
                    }
                    tbl.Rows.Add(row);
                }          
 }

それが私が列を列挙する方法です

   foreach (var firstRowCell in ws.Cells[3, 1, 3, ws.Dimension.End.Column])
                {
                    System.Type typeString = System.Type.GetType("System.String") ;
                    tbl.Columns.Add( firstRowCell.Text , typeString );
                }

それが関係するかもしれない人々のために、ここにファイルがあります(グーグル以外のユーザーにも機能します): https://drive.google.com/open?id=0B3kIzUcpOx-iMC1iY0VoLS1kU3M&authuser=

ExcelRange.valueプロパティが、フォーマットされていないすべてのオブジェクトを含む配列であることに気付きました。ただし、ExcelRangeのセルを繰り返し処理し、cell.Textプロパティを要求すると、既に処理されています。 ExcelRangeでConditionalFormattingとDataValidationを変更しようとしても役に立ちません(例:AddContainsText())-@ EDIT->シート全体に対しても:-(

ExcelRange.Valueを配列としてキャストしたくないのですが、これは醜く、非常に条件付きです。

10
Luntri

どうやらこれが解決策です(ただし、完全なコードではありませんが、datatableに列を追加する必要があります)。 Epplusで「フォーマットなし」を指定するフォーマット文字列が見つかりませんでしたが、ここにあります。

 var ws = MainExcel.Workbook.Worksheets.First();
 DataTable tbl = new DataTable();
 for (var rowNum = 1; rowNum <= ws.Dimension.End.Row; rowNum++)      
 {
     var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column];
     var array = wsRow.Value as object[,];

     var row = tbl.NewRow();
     int hhh =0;

     foreach (var cell in wsRow)
          {
           cell.Style.Numberformat.Format = "@";
           row[cell.Start.Column - 1] = cell.Text;
          }
     tbl.Rows.Add(row);
 }
11
Luntri

ファイル内のセルは、分数としてカスタムフォーマットされています。わざとこれをしましたか?とにかく、この形式を維持したい場合は、代わりにcell.Valueまたはcell.RichText.Textを使用して13桁の番号を取得できます。

お役に立てれば。

3
romar