2016-06-18 52 views
1

我已經承接了一個最近需要過濾Excel文件表格內容的小項目。我打算在這個項目中使用C#和EPPLUS,並將輸入的Excel錶轉換爲Datatable來處理所有的數據查詢。在C#中解釋Excel文件

但是,我從客戶端獲得的Excel文件是可疑的格式,其中表格遍佈表格中的填充描述和空格之間的空白處。每個Excel文件似乎有自己的安排數據量太大,下面是什麼我迄今所看到的舉例:

enter image description here

我只是做了一些嘗試與轉換Excel表到C#,但從目前爲止我所見過的系統基本上是從單元格A1開始迭代逐行數據。有沒有辦法在這個迭代過程中檢測表格,並將它們與標題/描述/空行分開?我想簡單地檢查表格邊框以確定是否有表格,但是對於方案D,某些Excel文件甚至沒有設置表格邊框。

我計劃通知客戶這個,所以我們可以就Excel文件的標準格式達成一致,但這是我第一個處理解釋Excel文件的項目,所以我也有一個小的元問題:這是否是正確的要做的事?我假設這些不同的Excel格式可能是由於業務選擇(即來自不同部門),因此對於過去遇到過這類問題的人來說,說服客戶改變他們當前的方法是一種常態或者我應該跟他們目前的工作一起工作?

+0

我不認爲客戶會接受這個答案。我會將表格導出爲CSV,然後將CSV導入到c#中。您可以編寫VBA宏來幫助您將表格保存爲CSV。 – jdweng

+0

您可以從C#訪問Excel對象模型,因此可以編寫一些邏輯來標識各種類型的表,如果只有合理數量的偏離您的預期偏差(例如,如果IsNumeric(範圍(「A1」)必須是表格單元格不是頭文件等),只是在網上搜索它,但它真的是讓客戶把他們的文檔變成可解析的格式(除非你希望他們繼續僱用你來解決混亂問題!!) – Absinthe

回答

0

正如在評論中提到的那樣,如果「表格」僅僅是分散的單元簇,那麼這是一個真正的混亂。你將不得不想出一些非常複雜的AI來嘗試檢測各種可能的情況。

如果不想讓客戶改變他們的做法,但他們願意調整一點點,我會建議使用真實的ExcelTables。有了這個,excel已經通過客戶端或者您應用表格爲您完成了工作。例如,這裏是在工作表中兩個隨機表:粘貼的相同細胞

enter image description here

請注意,我只是複製/但我格式化既是通過在右上角的按鈕表。這樣做不僅僅是讓它看起來不錯 - 它實際上會創建一個可以直接在EPPlus中引用的對象ExcelTable。這裏是東西,將演示的是:

public void Detect_Tables_Test() 
{ 
    //http://stackoverflow.com/questions/37901408/interpreting-an-excel-file-in-c-sharp 
    var fileInfo = new FileInfo(@"c:\temp\DetectTablesTest.xlsx"); 
    using (var pck = new ExcelPackage(fileInfo)) 
    { 
     var workbook = pck.Workbook; 
     var worksheet = workbook.Worksheets.First(); 
     var tables = worksheet.Tables; 

     tables.ToList().ForEach(table => 
     { 
      Console.WriteLine($"{{Name: {table.Name}, Address: {table.Address}, Columns: {table.Columns.Count}}}"); 
     }); 
    } 
} 

其中在輸出給出了這樣:

{Name: 'Table1', Address: 'G10:I20', Columns: 3} 
{Name: 'Table2', Address: 'A1:C11', Columns: 3} 

所以,現在你有,你可以使用它作爲參考來獲取數據的行/列地址,尋找它上面的描述行等。

+0

客戶同意實際設置標準格式,就是這樣。這很有趣,但我不知道EPPlus可以檢測到這些格式化的表格,以便稍後向客戶端提供建議。謝謝! – porkpork