2016-11-29 43 views
0

假設你有一個excel文件,有大量的數字和行,大約有100行。(C# - Excel)如何將公式寫入每個現有行的新創建列?

我想以編程方式編寫一個公式列,爲每個現有行添加一堆字段的值。

所以首先,我會爲Excel文件創建Openfiledialog,找到路徑,通過OleDb打開它。明白了這一點。現在說我有下表:

[朋友| Money |失去的錢|天過去了|解決方案]

比爾博,50,50,7,*化合物這裏

Bilso,80,50,7,*化合物這裏

等等

問題是,我不沒有確切的行數,所以我必須枚舉OleDb連接發現的任何東西。 該公式可能類似於=(B2-C2)* D2,但是2也是錯誤的,它必須與它所在的任何行相關,即:第3行將爲=(B3-C3)* D3。我不知道如何做到這一點。

我發現直接寫入單元格並不會使公式直接處理數字。

=====

編輯:

private Excel.Application Xls; 
    private Excel.Workbooks WBs; 
    private Excel.Workbook WB; 
    private Excel.Worksheet WS; 
    private Excel.Sheets SS; 
    Excel.Range cellsRange = null; 
    Excel.Range columnRange = null; 
    Excel.Range rowRange = null; 
    int numberOfColumns = 0; 
    int numberOfRows = 0; 
    private void btnColumn_Click(object sender, EventArgs e) 
    { 
     if (btnColumn.FlatStyle == FlatStyle.Flat) 
      btnColumn.FlatStyle = FlatStyle.Standard; 
     else 
     { 
      btnColumn.FlatStyle = FlatStyle.Flat; 
     } 

     OpenFileDialog openFileDialog = new OpenFileDialog(); 
     openFileDialog.Filter = "Excel Files|*.xls;*.xlsx"; 
     openFileDialog.ShowDialog(); 
     string pather = openFileDialog.FileName; 

     if (pather == "" || pather == " " || pather == null) 
     { 
      return; 
     } 

     if (!string.IsNullOrEmpty(openFileDialog.FileName)) 
     { 
      try 
      { 
       Xls = new Excel.Application(); 
       WBs = Xls.Workbooks; 
       WB = WBs.Open(pather, 0, false, 5, "", "", true, 
        XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 
       SS = WB.Worksheets; 
       WS = SS.get_Item(1);      
       cellsRange = WS.Cells; 
       columnRange = cellsRange.Columns; 
       rowRange = cellsRange.Rows; 
       numberOfColumns = columnRange.Count; 
       numberOfRows = rowRange.Count; 
       int LastCell = numberOfColumns+1; 
       WS.Cells[1, LastCell] = "Tax Formula"; 
       for (int i = 2; i < numberOfRows; i++) 
       { 
        //string niceFormula = "=SUM(L" + i + ",M" + i + ")*N"+ i ; 
        //WS.Cells[i, LastCell].Formula = niceFormula; 
        WS.Cells[i, LastCell].Value = (WS.Cells[i, 12] + WS.Cells[i, 13]) * WS.Cells[i, 14]; 
       } 
       //========================== 
       WB.Save(); 
      } 
      catch (Exception ex) 
      { 
       MessageBox.Show("Write Excel: " + ex.Message); 
      } 
      finally 
      { 
       GC.Collect(); 
       GC.WaitForPendingFinalizers(); 
       WB.Close(); 
       Xls.Quit(); 

       releaseObject(cellsRange); 
       releaseObject(columnRange); 
       releaseObject(rowRange); 
       releaseObject(SS); 
       releaseObject(WS); 
       releaseObject(WBs); 
       releaseObject(WB); 
       releaseObject(Xls); 
      } 
     MessageBox.Show("Finished Updating File", "Task complete"); 
    } 
} 

任何人都知道爲什麼這個代碼在寫入嘗試拋出下面的錯誤?

HRESULT:0x800A03EC爲您提供方便

Repasted全部代碼。它仍在吐出HRESULT錯誤。

目標項目是4行深,1行標題和約16列寬。

+1

這將是緩慢通過一個處理每個單元格值之一。我建議你將Excel中的全部數據導入數據表中,並進行計算(使用LINQ或常規循環),並將計算值添加到同一數據表中的新列中。最後以所需的格式將數據表導出到Excel工作表。 –

+0

你沒有告訴我們,你怎麼寫日期。 VBA?或Excel Interop的Winform應用程序?還是帶有EPPlus的WinForm應用程序?請詳細說明。 – nabuchodonossor

+0

@nabuchodonossor,我最初將它打開,因爲有時候有人會準備好VBA答案,但會被C#標記關閉。在某些情況下,我可以將自己的邏輯轉換成適合C#的邏輯,這樣就會有更多的總體答案,但是,這是Winform和Excel Interop。 – Aroueterra

回答

1

編輯:

你可以試試這個:

numberOfColumns = WS.UsedRange.Columns.CountLarge; 
numberOfRows = WS.UsedRange.Rows.CountLarge; 

唉,也改變他們long而不是int如果使用CountLarge,而不是Count

好了 - 我得到這個最後工作 - 不知道爲什麼我有這麼多問題。

對我來說,我顯然必須使應用程序可見或它不工作。

有可能是另一種解決辦法 - 我把它從這裏:https://stackoverflow.com/a/17061714/1274820

此代碼爲我工作的最後:

注意,這是一個控制檯應用程序(想我會排除這種可能性),但你應該能夠添加魔術線。

Application excelApp = new Application(); 
excelApp.SheetsInNewWorkbook = 1; 
//////////////////////////////////////////// 
//Add these lines to make it work??? 
//////////////////////////////////////////// 
try { 
    excelApp.Visible = true; 
} 
catch {} 
//////////////////////////////////////////// 
Workbook excelWB = excelApp.Workbooks.Open(@"C:\test.xls", Type.Missing, false); 
_Worksheet excelWS = excelWB.Sheets[1]; 
Range cellsRange = excelWS.UsedRange; 
long LastCell = cellsRange.Columns.CountLarge + 1; 
long numberOfRows = cellsRange.Rows.CountLarge; 
excelWS.Cells[1, LastCell] = "Tax Formula"; 
for (int i = 2; i <= numberOfRows; i++) 
{ 
    string niceFormula = "=SUM(L" + i + ",M" + i + ")*N" + i; 
    excelWS.Cells[i, LastCell].Formula = niceFormula; 
} 
excelWB.Close(true); 
excelApp.Quit(); 

前:

Before

後:

After

如何填寫一個DataTable有一個Excel電子表格:

////////////////////////////////////////////////////////////////////////////////// 
//This function is absolute magic >.> - Fill DataTable with excel spreadsheet 
//HDR=YES means "Spreadsheet has headers" Change to NO if not. 
//name = "Log"; - This is the Sheet name to pull the data from 
////////////////////////////////////////////////////////////////////////////////// 
//oconn takes an SQL like command (Select Everything from name sheet) using con 
//HDR=YES means that our data has headers :) 
////////////////////////////////////////////////////////////////////////////////// 
String constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + copyToPath + ";Extended Properties='Excel 12.0 XML;HDR=YES;';"; 
OleDbConnection con = new OleDbConnection(constr); 
OleDbCommand oconn = new OleDbCommand("Select * From [Log$]", con); 
con.Open(); 
OleDbDataAdapter sda = new OleDbDataAdapter(oconn); 
DataTable data = new DataTable(); 
sda.Fill(data); 
con.Close(); 
////////////////////////////////////////////////////////////////////////////////// 
+0

呵呵,那是比我周圍更加整潔,雖然我不是植入到數據表中,而是一個DataGridView。使用這個,你將如何訪問數據中的數據?像你會陣列? int'foo = data [1,1]'?我使用數據表的唯一時間是填充一個DataGridView(我_then_接口)退出,但它的工作。哦,順便說一句,正如我上面評論的,我試過你的代碼,但我得到了和以前一樣的錯誤。也許我的範圍聲明有問題,我沒有注意到? – Aroueterra

+0

我正在向你的atm反向工作 - 你在代碼中聲明瞭兩次'Xls'和'Wbs',所以顯然存在一個問題。在打開文件之前,您還獲取了工作簿對象。這可能不是一個好主意。 – user1274820

+0

我發佈了我的整個代碼,沒有公式位,類似的代碼在另一個函數中起作用,只是將值添加到單元格中,所以代碼的基本結構應該可以工作。但由於某些原因,我仍然收到HRESULT錯誤。 – Aroueterra

相關問題