您好我有一个WinForm应用程序,可生成大量数据。目前,我有一个Excel .xls文件格式的可维护和可打开。但是,我想放弃这一点,以便用户无法在Excel中打开文件并自由修改内容。
我提出的解决方案是将其编码为新文件类型,例如“.por”文件。但是我也不希望这是扩展的简单重命名,以便用户可以重命名回.xls并进行编辑。我怎么能这样做?
此外,我正在以程序方式将DataTable
逐行写入Excel文件。使用不同的方法(而不是SQL)保存DataTable
内容会有帮助吗?
答案 0 :(得分:6)
执行此操作的一种简单方法是将DataTable
放入DataSet
,调用DataSet
的{{1}}方法(将以XML格式保存数据)格式化为文件),然后使用WriteXml(...)
加密文件。
要从文件中读取,请使用File.Encrypt
将文件转换回普通XML文件,然后使用DataSet {{1}将其加载到File.Decrypt
中来反转该过程。方法。
答案 1 :(得分:0)
只需序列化您的对象并将其写入磁盘即可。如果您想让用户更难以在文本编辑器或其他内容中打开,请使用二进制文件。
答案 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;
}