2012-06-22 23 views
0

您好,我有一個WinForm應用程序可以生成大量數據。目前我有這種可以以Excel .xls文件格式保存和打開的功能。但是我想遠離這一點,以便用戶不能在Excel中打開文件並自由修改內容。創建,寫入和讀取新文件類型

我想出的解決方案是將其編碼爲新文件類型,例如「.por」文件。不過,我也不希望這是擴展名的簡單重命名,以便用戶可以重命名爲.xls並進行編輯。我怎樣才能做到這一點?

此外,我正在編程DataTable並逐行寫入Excel文件。使用其他方法(不是SQL)可以幫助保存DataTable內容嗎?

+0

你見過上生成Excel文件的LINQ to XML的任何物品,有一個未知的擴展(&/或MIME類型),這將有助於僞裝文件。 –

+0

備註:如果你想讓用戶不打開你的文件 - 不要創建它們(半開玩笑)。如果您使用常用的文件格式(即Excel的,一些XML,CSV ...)你有兩個好處 - 用戶可以放心,數據不會消失,因爲你希望刪除舊的文件格式,並且可以通過使用另一種工具來獲得相同的文件格式,從而輕鬆確認數據是否合理。雖然自定義格式是有趣的想法開始,它也帶有定製版本,遷移,轉換爲其他格式。根據你是否關心用戶,你可能花費你太多的努力... –

+0

我知道你說過「不是SQL」,但你看過使用SQL CE。它是一個輕量級的SQL版本,不需要安裝,它可以與所有內置的API一起使用。這是一篇很棒的文章,內容涵蓋ScottGu的一個基本[如何](http://weblogs.asp.net/scottgu/archive/2011/01/11/vs-2010-sp1-and-sql-ce.aspx)。 – Zachary

回答

6

一個簡單的方法來做到這一點是把你的DataTableDataSet,調用DataSetWriteXml(...)方法(將在XML格式的數據保存到一個文件),然後加密的文件使用File.Encrypt

從文件中讀取,你扭轉過程中,採用File.Decrypt打開文件重新導入一個純XML文件,然後使用DataSet的ReadXml(...)方法將其加載到DataSet

+0

+1加密 – ZnArK

+0

那麼,你用錘子來驅動釘子,扳手來轉動螺栓等 – MusiGenesis

+0

+1你的一個有遠見者:) –

-1

更好的是,製作一個MIME Type,這樣當用戶雙擊「.por」文件時,它會觸發一個exe文件來告訴用戶該做什麼。而不是在Excel中打開它。如果你不告訴他們,用戶不會知道por文件是Excel文件。

由於XLS的是二進制文件 - 如果文件的擴展名更改用戶不會 知道MIME類型,除非他們使用的是這樣的: Determining MIME Type of MAC upload stream file

關於採取一個DataTable和逐行寫入Excel文件。

你可以很容易地將數據轉換成二維數組:

string[,] TwoDimensional = new string[dt.Rows.Count, dt.Columns.Count]; 
for (int i = 0; i < dt.Rows.Count; i++) 
{ 
    for (int j = 0; j < dt.Columns.Count; i++) 
    { 
     TwoDimensional[i, j] = dt.Rows[i][j].ToString(); 
    } 
} 

而且一舉將它們設置在Excel中:

using (var targetRangeHeader = _excelApp.Range["A1"].WithComCleanup()) 
using (var targetRangeFirstDataCell = targetRangeHeader.Resource.Offset[1, 0].WithComCleanup()) 
using (var targetRange = targetRangeFirstDataCell.Resource.Resize[LengthOfArray, 1].WithComCleanup()) 
{ 
.... 
targetRange.Resource.Value2 = TwoDimensional; 

注意我使用VSTO Contrib爲finalistic決心 - 即using聲明。

不要忘記這一點(記錄當前的計算模式,並恢復它,而不是假設用戶使用的是自動):

public static void TurnOffApplicationSettings(Excel.Application xlApp) 
     { 
      xlApp.ScreenUpdating = false; 
      xlApp.DisplayAlerts = false; 
      xlApp.Calculation = XlCalculation.xlCalculationManual; 
      xlApp.UserControl = false; 
      xlApp.EnableEvents = false; 
     } 

     public static void TurnOnApplicationSettings(Excel.Application xlApp) 
     { 
      xlApp.ScreenUpdating = true; 
      xlApp.DisplayAlerts = true; 
      xlApp.Calculation = XlCalculation.xlCalculationAutomatic; 
      xlApp.UserControl = true; 
      xlApp.EnableEvents = true; 
     } 
+0

downvoter謹慎解釋? –