2014-02-26 75 views
1

我想使用SpreadsheetGear將數據從DataTable導出到Excel文件中。 Excel文件中的工作表將從具有列標題和特定格式的模板中複製。爲了便於維護(更改存儲過程和模板以更改報告內容,而不是重新部署服務),我不想在代碼中執行某些列格式設置,即列填充顏色。SpreadsheetGear CopyFromDataTable單元格格式

我使用SpreadsheetGear的CopyFromDataTable來執行導出。但是,InsertCells標誌不會導致數據採用其插入的行的格式(列填充顏色),如說明註釋(「這允許對單元格進行預格式化」)。

我正在解決這個問題,不使用InsertCells標誌,而只是在模板中的整個列上設置列填充顏色。但是,這會導致整列被着色,包括超出使用範圍。我想限制格式化到使用的範圍。

是否有某種方法可以清除UsedRange的以外的任何格式?當我寫這篇文章時,我意識到這種方法令人費解。但格式化是強制性的,我想簡化維護,只需要存儲proc更改和模板更改。我願意接受任何可能的方法來促進這一點。

+0

澄清 - 表中的列數和行數是否不確定?否則,如果總是有固定數量的列和行,可以預設工作表模板中目標區域的格式。 – Xcheque

+0

@Xcheque - 列數是已知的,它們在模板中被預先格式化,它只是行(不確定的數量)是問題。我不想格式化超過所用行數的列,如果我在模板中的整個列上設置填充顏色,會發生這種情況。我無法使SpreadsheetGear插入行爲像Excel中的手動插入,其中插入的行採用上面插入的格式。 –

回答

2

SetDataFlags .InserCells enum選項應該允許在僅由DataTable填充的範圍內選擇格式。不過,也有具體要求,使這項工作正常,如在規定的documentation

「當指定該標誌[而insertCells],你必須提供確切兩行數據的範圍,由一排列前如果未指定SpreadsheetGear.Data.SetDataFlags.NoColumnHeaders,則標題爲「。

「數據的兩行」應格式化,但您需要(內部/填充顏色等)。 SpreadsheetGear附帶的Explorer示例解決方案(可在開始菜單/屏幕的SpreadsheetGear文件夾中找到)包含一個示例,該示例演示了Reporting> DataSet to Workbook

UPDATE

以下是一個演示如何使用NoColumnHeaders使用而insertCells標誌相結合的例子。此代碼假定您已經使用格式化範圍設置了worksheet,並且您可以獲取DataTable,其大小與格式化範圍中的列數相對應。

using SpreadsheetGear; 
using SpreadsheetGear.Data; 

// Generate DataTable. For this example, let's say it is 5 columns wide and 
// 10 rows deep... 
DataTable dataTable = // ...get DataTable... 

// We're not interested in a "Column Header" row, so for the above dataTable, 
// an IRange 5 columns wide and 2 rows deep needs to be specified where those 
// two rows are already setup with the desired formatting. In this case B2:F3 
// are formatted accordingly. 
worksheet.Cells["B2:F3"].CopyFromDataTable(dataTable, SetDataFlags.InsertCells | 
    SetDataFlags.NoColumnHeaders); 

// Sheet should how have B2:F11 populated with your dataTable data, with all 
// rows having picked up the formatting as originally specified in B2:F3 
+0

是的,我通讀了這個。該文檔有點令人困惑,因爲據我所知,你不能指定第二個數據標誌。因此,如果您正在設置InsertCells,則無法設置NoColumnHeaders,反之亦然(請糾正我,如果我錯了)。除此之外,儘管如此,這正是我採取的方法,並沒有按照要求工作。它的行爲就像粘貼值 - 數據只是放在單元格已有的格式上。 –

+0

可以使用多個標誌。你只需要使用按位或運算符(|)來合併它們。關於您使用此功能的整體問題,我不知道使用InsertCells有任何問題,並且我爲SpreadsheetGear工作,所以我應該知道!我將用一個演示此功能的示例修改我的答案,以防情況有所幫助。 –

+0

有趣的是,我知道我遲早需要學會按位運算符!我會試試看看會發生什麼。 –

1

我有兩個建議

1)不是很優雅,但你可以使用條件格式的Excel模板爲您預期來填充表格的最大行數。如果單元格不是空白或者同一行中的某個其他參考單元格符合定義的條件,則應該可以打開所需的格式。

2)使用Datatable.Rows.Count來計算C#數據表中的行數,然後根據該信息構造一個Excel單元格範圍定義。粘貼到表格後,將所需的格式應用到目標單元格區域(對不起,代碼示例沒有時間)。

+0

感謝您的建議。與1) - 行數不是很可預測的。但也許我可以有條件地格式化每一行(它是.xls所以不是太可怕),然後複製數據後,複製並粘貼整個工作表以刪除條件格式(是否有格式化「粘貼值」等效? )然後刪除所有的空白行。與2) - 我這樣做與原始實施,但我不希望代碼做任何格式(以避免重新部署)。也許我可以避免這一切,只是讓用戶在使用範圍之外的列格式方面行得通... –