0

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

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

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

4

3 回答 3

6

一种简单的方法是将您DataTable放入DataSet,调用DataSet'WriteXml(...)方法(这会将您的数据以 XML 格式保存到文件中),然后使用File.Encrypt.

要从文件中读取,您需要反转该过程,使用File.Decrypt将文件转回纯 XML 文件,然后DataSet使用 DataSet 的ReadXml(...)方法将其加载到 a 中。

于 2012-06-23T00:14:33.337 回答
0

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

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

于 2012-06-22T23:53:36.417 回答
-1

更好的是,制作一个MIME Type这样当用户双击“.por”文件时,它会触发一个 exe 来告诉用户该做什么。而不是在 Excel 中打开它。如果您不告诉他们,用户将不会知道 por 文件是 Excel 文件。

由于 xls 是二进制文件 - 如果文件的扩展名被更改,用户将不知道 MIME 类型,除非他们使用这样的东西: 确定 MAC 上传流文件的 MIME 类型

关于获取数据表并逐行将其写入 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;
        }
于 2012-06-23T00:54:34.023 回答