4

C# から OLDEDB を使用してエントリを Excel ファイルに書き込む際に問題が発生しています。基本的に、一部の情報をフォーマットするために Excel テンプレート ファイルを使用したいと考えています。アイデアは、ユーザーがクエリを実行できるということです。結果は Excel ファイルに取り込まれ、ユーザーは引き続き Excel を使用して結果を操作できます。

これを行うには、「raw_data」タブを作成し、OLEDB を使用してテーブルのように書き込みます。ただし、プリセットの計算で問題が発生しています。一部の列はテキストであり、他の列は数値であり、フォーラムはシートが開かれるとすぐにこれらの列を参照する必要があります。

Excel バージョン 2003 C#/.Net 3.5

ここに私の接続文字列があります

string connectString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source={filename};Extended Properties=""Excel 8.0;HDR=YES;IMEX=0""";

{filename} get は、コードの後半でファイルへのパスに置き換えられます

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");
using (DbConnection connection = factory.CreateConnection())
{
  connection.ConnectionString = connectString;
  using (DbCommand command = connection.CreateCommand())
  {

    connection.Open();
    query = "INSERT INTO [raw_prod$] (correlationid, created, ipaddr, nai, started, delta, csid, bytesin, bytesout, cause, bsid, servopt, svzone) VALUES (\"{correlationid}\", \"{created}\", \"{ipaddr}\", \"{nai}\", \"{started}\", {delta}, \"{csid}\", {bytesin}, {bytesout}, {cause}, \"{bsid}\", \"{servopt}\", \"{zone}\")";
    //Replace {} code with actual values skipped
    command.CommandText = query;
    command.ExecuteNonQuery();
  }
}

この実行時にデータが期待どおりに入力されますが、Excel はデータをテキストとして扱うため、sum(c2:c100) などは機能しません。エントリを強調表示して Enter キーを押すと、自動的にテキストになります。テンプレートで列を数字にフォーマットしようとしましたが、ご覧のとおり、SQLの二重引用符を削除しました。

すべての計算が機能するように、これらのエントリをすぐに数値として扱うようにするにはどうすればよいですか?

ありがとう

4

4 に答える 4

2

私はそれを理解しました、それは実際にはちょっとばかげた迷惑なものでした。任意の列の行 2 ~ 8 の Excel ファイルで、ダミーの数値を入力した数値にしたいと考えていました。このようにして、Jet ドライバーは、それらの列をスキャンするときに数値を確認し、それらの列の番号を考慮します。C# からの挿入は 9 行目から開始され、それに応じてテンプレートを編集して、9 行目以降の計算のみを開始しました。本当に痛いですが、効果があるようです。

于 2009-05-26T03:37:01.633 に答える
2

TypeGuessRows の reg 設定を変更してみましたか? HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows は、Jet 4.0 を探す場所です。デバッグの目的で、デフォルトの 8 より大きい数値に設定できます (または、最初の行が正しいことが確実な場合は、1 に設定します)。

Daily DoesMSDNのデバッグに役立つリンク

あはは!コードの下部にある例を見つけました。数値である値を囲む引用符を削除してみてください

\"{correlationid}\", \"{created}\", \"{ipa

だと思います

{correlationid}, \"{created}\", \"{ipa
于 2009-05-26T00:15:43.610 に答える
0

Excel 2007 でも同じ問題が発生し、次の 2 つの方法で解決しました。

  • 上記のphilwが言及したCREATE TABLEメソッドを使用する
  • 接続文字列を変更し、Excel 12.0 部分の後に「xml」を追加する

次のコード サンプルを参照してください。

string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""" + scratchFile 
    + @""";Extended Properties=""Excel 12.0 xml;HDR=YES""";   

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.OleDb");

using (DbConnection connection = factory.CreateConnection())
{
    connection.ConnectionString = connectionString;

    using (DbCommand command = connection.CreateCommand())
    {
        connection.Open();

        command.CommandText = @"CREATE TABLE [RawData$] " + 
            "([Organization] varchar(255), " +
            "[Department] varchar(255), [TotalSales] int, [TotalHours] int)";
        command.ExecuteNonQuery();

        command.CommandText = @"INSERT INTO [RawData$] " +
            "(Organization,Department,TotalSales,TotalHours)" +
            "VALUES('Organization','Department',700,70)";

        command.ExecuteNonQuery();

    }
}
于 2011-07-18T19:45:12.260 に答える
0

これを行うには、エクスポート用のテーブルを作成するときに、列の型を Jet に明示的に伝えます。

 "create table [tabName] ([col1] varchar(255), [col2] double)"

唯一の問題は、文字データを数値列に貼り付けようとすると、挿入時に Jet がスローすることです。これは当然のことです。

関連する問題は、null の処理方法です。空の文字列は、Jet に関する限り null ではありません。数値列に挿入しようとすると、Jet がスローします。

于 2010-08-20T07:23:51.767 に答える