创建,写入和读取新文件类型

时间:2012-06-22 23:48:32

标签: c# datatable save

您好我有一个WinForm应用程序,可生成大量数据。目前,我有一个Excel .xls文件格式的可维护和可打开。但是,我想放弃这一点,以便用户无法在Excel中打开文件并自由修改内容。

我提出的解决方案是将其编码为新文件类型,例如“.por”文件。但是我也不希望这是扩展的简单重命名,以便用户可以重命名回.xls并进行编辑。我怎么能这样做?

此外,我正在以程序方式将DataTable逐行写入Excel文件。使用不同的方法(而不是SQL)保存DataTable内容会有帮助吗?

3 个答案:

答案 0 :(得分:6)

执行此操作的一种简单方法是将DataTable放入DataSet,调用DataSet的{​​{1}}方法(将以XML格式保存数据)格式化为文件),然后使用WriteXml(...)加密文件。

要从文件中读取,请使用File.Encrypt将文件转换回普通XML文件,然后使用DataSet {{1}将其加载到File.Decrypt中来反转该过程。方法。

答案 1 :(得分:0)

只需序列化您的对象并将其写入磁盘即可。如果您想让用户更难以在文本编辑器或其他内容中打开,请使用二进制文件。

http://msdn.microsoft.com/en-us/library/ms233843.aspx

答案 2 :(得分:-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进行最终确定 - 即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;
        }