2

すべて、このテーマについては多くの質問がありますが、私の問題を解決するものはありません。DataSetOleDbとAccessDatabaseEngineを使用して、渡された/をExcelにエクスポートするためのかなり複雑なルーチンを作成しましたDataTable(Office 2010はWin7で実行されています)。問題は、Excelに書き込む列をどのように定義しても、すべての値がTEXT/STRINGフィールドとしてエクスポートされることです。

OleDbConnection文字列を使用しています

string fileName = @"F:\SomePath\MyExcel.xlsx";
string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=
    {0};Extended Properties=""Excel 12.0 Xml;HDR=YES;MaxScanRows=0;IMEX=0""", fileName);

運が悪かったので、他の多くの接続文字列オプションを試しました。

私はコードでExcel定義を生成しますが、明示的にこれらは次のように生成されます

CREATE TABLE [MetaTab] ([Table] TEXT,[Field] TEXT,[Seq] NUMBER,[DataLevel] NUMBER)

次に、挿入用のコードを生成します。上記の例では、

INSERT INTO [MetaTab$]([Table],[Field],[Seq],[DataLevel])VALUES('B1A','EstabID','1','9')

これは機能しますが、すべての値はTEXTとして書き込まれます。Excelに他のデータ形式を強制するにはどうすればよいですか?

注:文字列以外のアポストロフィを削除しようとしましたが、これも機能しません。私は心から立ち往生しており、どんなアイデアでも大歓迎です。御時間ありがとうございます。

4

2 に答える 2

1

私はあなたができるとは思わない。Excel形式は、実際にはデータベース列のデータ型に類似していません。最終的に、基になる値は常に数値または文字列のいずれかです。次に、フォーマットによって表示方法が決まります。

私が間違っていても(個人的にはhttp://epplus.codeplex.com/を使用してExcelスプレッドシートを生成することを好みます)、フォーマットなどの単純なものだけでなく、非常に高度なものもたくさん実行できます。

于 2012-04-27T10:51:23.100 に答える
1

Excelシートに値を挿入しているときに数値を挿入するためのヒント(構文)をOleDbCommandに与えることはできません。シートを開いたときに、シートに数値が数値として表示されません。

回避策があります。最初のレコードがExcelファイルに作成されたら、最初のレコードに移動して、既存のレコードのセル(数値データが必要な場合)に同じ値を再入力します。

また

そのExcelシートに数値を含むデフォルトのレコードを配置できます。

シートに最初のレコードが作成された後にデータ型を数値に変換するためのサンプルコードを以下に示します。レコードのいずれかがシートに挿入されたときにChangeFormat関数を呼び出すと、それ以降のデータは適切な形式で保持されます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Office.Interop.Excel;
using System.Data;

namespace ConsoleApplication3
{
    class Program
    {
        static void Main(string[] args)
        {


        System.Data.DataTable xlsData = new System.Data.DataTable();
        string xlsConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=d:\\romil.xlsx;Extended Properties=\"Excel 12.0;HDR=Yes;\"";
        System.Data.OleDb.OleDbConnection xlsCon = new System.Data.OleDb.OleDbConnection(xlsConnectionString);
        System.Data.OleDb.OleDbCommand xlsCommand;
        int recUpdate;
        int recordsinSheet;

        xlsCommand = new System.Data.OleDb.OleDbCommand("Select count(*) as RecCount from [Sheet1$]");
        xlsCommand.Connection = xlsCon;
        xlsCon.Open();
        recordsinSheet =Convert.ToInt32( xlsCommand.ExecuteScalar());

        xlsCommand=   new System.Data.OleDb.OleDbCommand("Insert into [Sheet1$] (Field1,Field2) values ('123',2)");
        xlsCommand.Connection = xlsCon;

        recUpdate = xlsCommand.ExecuteNonQuery();
        xlsCon.Close();

        if ((recordsinSheet + recUpdate) == 1)
            ChangeFormat();

        Console.ReadKey();

    }

    private static void ChangeFormat()
    {
        string filename = "d:\\romil.xlsx";

        object missing = System.Reflection.Missing.Value ;

        Microsoft.Office.Interop.Excel.Application excel = new Microsoft.Office.Interop.Excel.Application();

        Microsoft.Office.Interop.Excel.Workbook wb = excel.Workbooks.Open(filename, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing, missing);

        Microsoft.Office.Interop.Excel.Worksheet wsh=null;
        foreach (Microsoft.Office.Interop.Excel.Worksheet sheet in wb.Sheets)
        {
            if (sheet.Name == "Sheet1")
            {
                wsh = sheet;
                break;
            }
        }

        for (int rCnt = 2; rCnt <= wsh.Rows.Count; rCnt++)
        {

            if  ( wsh.Cells[rCnt, 2].Value== null)
                break;

            wsh.Cells[rCnt, 2] = wsh.Cells[rCnt, 2].Value;
        }    

        wb.SaveAs(filename, missing,
            missing, missing, missing, missing,
           Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
            missing, missing, missing,
            missing, missing);
        wb.Close();
    }
}

}

于 2012-04-28T15:34:14.707 に答える