0

こんにちは、大量のデータを生成する WinForm アプリがあります。現在、このファイルは Excel .xls ファイル形式で保存および開くことができます。ただし、ユーザーが Excel でファイルを開いて内容を自由に変更できないように、これを避けたいと思います。

私が思いついた解決策は、これを新しいファイルタイプ、たとえば「.por」ファイルとしてエンコードすることです。ただし、ユーザーが名前を .xls に戻して編集できるように、これを拡張子の単純な名前変更にしたくありません。これどうやってするの?

さらにDataTable、これをExcelファイルに書き出す行ごとにプログラムで取得しています。DataTable別の方法 (SQL ではない) を使用して内容を保存すると役に立ちますか?

4

3 に答える 3

6

これを行う簡単な方法は、 を に入れ、DataTableのメソッドDataSetを呼び出し(データを XML 形式でファイルに保存します)、 を使用してファイルを暗号化することです。DataSetWriteXml(...)File.Encrypt

ファイルから読み取るには、プロセスを逆にして、 を使用File.Decryptしてファイルをプレーン XML ファイルに戻してからDataSet、DataSet のReadXml(...)メソッドを使用して に読み込みます。

于 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 タイプの決定

DataTable を取得し、行ごとにこれを Excel ファイルに書き出すことについて。

データを 2 次元配列に簡単に取り込むことができます。

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 に答える