2015-04-03 74 views
8

我正在開發一個應用程序來讀取xlsx文件,做一些驗證並插入數據庫。不幸的是,當我嘗試閱讀標記爲數字的列(fe與EAN-13代碼)時,我得到了int的最小值。 用戶沒有看到這個,因爲Excel正確顯示它。強制EPPLUS讀取爲文本

我怎樣才能讓它讀取文件爲純文本?我知道我可以使用OLEBD,但我也需要動態編輯文件,所以epplus ExcelPackage是最佳選擇。

下面是使用代碼IM:

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=0

我注意到ExcelRange.value屬性是一個包含所有未格式化對象的數組。但是,一旦您遍歷ExcelRange中的單元格並請求cell.Text屬性,它已經被處理。嘗試修改ExcelRange中的ConditionalFormatting和DataValidation沒有幫助(fe AddContainsText()) - @EDIT - >對於整個工作表都沒有幫助:-(

我不希望將ExcelRange.Value轉換爲Array,它很醜非常有條件的。

+2

請問請問如何將列標記爲數字? – SharpCoder 2015-04-06 08:34:21

+0

我編輯的問題,仍然不知道如何正確地做到這一點。 – Luntri 2015-04-08 12:05:00

+1

它在哪裏讀取以「int.MinValue」形式出現的單元格?我看到一行你有'row [...] cell.Text',但是'Text'屬性應該是一個字符串。我不記得它是一個對象。 – krillgar 2015-04-08 12:09:53

回答

8

顯然這是解決方案(不完整的代碼,但你必須添加列到數據表)。我無法找到在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); 
} 
+1

要添加一些說明,'[cell/range] .Numberformat.Format =「@」;'將生成的工作表中的指定單元格/範圍格式化爲文本格式(與常規,數字,貨幣,會計覈算,短日期等相對) ) – DaveD 2015-11-16 21:18:24

2

在你的文件中的細胞自定義格式化爲一小部分。你有沒有故意反正這樣做呢? ,如果你想保持這種格式,您也可以使用cell.Valuecell.RichText.Text讓你13 -digit number。

希望對您有所幫助

+0

這是向我發送文件的用戶。我根本不負責編輯它們。我發現現在正確地做到這一點的方式, BTW Cell.value已在您請求時處理:) – Luntri 2015-04-29 11:56:21

+1

解決了我的問題。 - >'cell.Text'顯示VISIBLE部分,但不是單元格中的完整值,而'cell.Value'給了我全部值。順便說一句,'cell.RichText.Text'似乎在遍歷一行的單元格時引發了一個奇怪的問題。 – Anytoe 2016-05-13 10:33:30