2017-07-21 17 views
0

ビューからいくつかのデータを挿入してシートに挿入しますが、10進数の列は数値型を挿入しないで、テキストとして挿入されています。問題?
here is an exampleCを使用してシートをExcelに安全に挿入するには

using (OleDbConnection cn = new OleDbConnection(connectionString)) 
      { 
       cn.Open(); 


       for (int i = 0; i < Grid.RowCount; i++) 
       { 
        OleDbCommand cmd1 = new OleDbCommand("INSERT INTO [Data$] " + 
        "([Title],[Name],[DayOfWeek],[Approval State],[Date],[User ID],[Week],[Project Code],[Project Regular Hours],[Project Overtime Hours],[Sick],[Vacation],[Holiday],[Unpaid Leave],[Other],[Timesheet URL])" + 
        "VALUES(@Title,@Name,@DayOfWeek,@ApprovalState,@Date,@UserID,@Week,@ProjectCode,@ProjectRegularHours,@ProjectOvertimeHours,@Sick,@Vacation,@Holiday,@UnpaidLeave,@Other,@TimesheetURL)", cn); 



        List<OleDbParameter> parameters = new List<OleDbParameter> 
        { 
         new OleDbParameter("@Title", Grid.GetRowCellValue(i,"Title").ToString()), 
         new OleDbParameter("@Name", Grid.GetRowCellValue(i,"Ad_Soyad").ToString()), 
         new OleDbParameter("@DayOfWeek", Grid.GetRowCellValue(i,"DayOfWeeks").ToString()), 
         new OleDbParameter("@ApprovalState", Grid.GetRowCellValue(i,"ApprovalState").ToString()), 
         new OleDbParameter("@Date",Grid.GetRowCellValue(i,"Tarix").ToString()), 
         new OleDbParameter("@UserID", Grid.GetRowCellValue(i,"UserID").ToString()), 
         new OleDbParameter("@Week", Grid.GetRowCellValue(i,"Weeks").ToString()), 
         new OleDbParameter("@ProjectCode", Grid.GetRowCellValue(i, "ProjectCode").ToString()), 
         new OleDbParameter("@ProjectRegularHours",Convert.ToDecimal(Grid.GetRowCellValue(i, "ProjectRegularHours").ToString(),new CultureInfo("en"))){DbType=DbType.Decimal}, 
         new OleDbParameter("@ProjectOvertimeHours", Grid.GetRowCellValue(i,"ProjectOvertimeHours").ToString()){DbType=DbType.Decimal}, 
         new OleDbParameter("@Sick", Grid.GetRowCellValue(i,"Sick").ToString()), 
         new OleDbParameter("@Vacation", Grid.GetRowCellValue(i,"Vacation").ToString()), 
         new OleDbParameter("@Holiday", Grid.GetRowCellValue(i,"Holiday").ToString()), 
         new OleDbParameter("@UnpaidLeave", Grid.GetRowCellValue(i,"UnpaidLeave").ToString()), 
         new OleDbParameter("@Other", Grid.GetRowCellValue(i,"Other").ToString()), 
         new OleDbParameter("@TimesheetURL", Grid.GetRowCellValue(i,"TimesheetURL").ToString()) 
        }; 

        cmd1.Parameters.AddRange(parameters.ToArray()); 

        cmd1.ExecuteNonQuery(); 
       } 


      } 
+0

どのように挿入しますか?コードを追加します。あなたは「安全に」挿入するという意味はどういう意味ですか? –

+0

コードを投稿しないと、コードの問題を解決することは不可能です。 Excelは問題なく小数点を処理できます。 *ローカライズされた*文字列の代わりに*小数点記号*を挿入してもよろしいですか? –

+0

コードのスクリーンショットではなく、質問に*コード*を載せてください。スクリーンショットはコンパイルできません –

答えて

0

コードitselsは、Excelにそれらを挿入する前局在文字列に値を変換します。それは変換の問題を引き起こすことが保証されています。ヨーロッパのどの国でもこのコードを実行すると、24.5は24,5になります。

値を文字列に変換しないでください。オブジェクトとして返された場合は、最初に正しい型にキャストします。いずれの反復でもコマンドオブジェクトを再構築する必要はありません。ただ、例えば、一度作成正しい OleDbTypeを渡すと、各行のパラメータを変更します。

var query="INSERT INTO [Data$] " + 
       "([Title],[Name],[DayOfWeek],[Approval State],[Date],[User ID],[Week],[Project Code],[Project Regular Hours],[Project Overtime Hours],[Sick],[Vacation],[Holiday],[Unpaid Leave],[Other],[Timesheet URL])" + 
       "VALUES(@Title,@Name,@DayOfWeek,@ApprovalState,@Date,@UserID,@Week,@ProjectCode,@ProjectRegularHours,@ProjectOvertimeHours,@Sick,@Vacation,@Holiday,@UnpaidLeave,@Other,@TimesheetURL)"; 
var cmd1 = new OleDbCommand(query, cn); 

cmd1.Parameters.Add("@Title",OleDbType.VarWChar,20); 
cmd1.Parameters.Add("@Name",OleDbType.VarWChar,20); 
cmd1.Parameters.Add("@DayOfWeek",OleDbType.VarWChar,20); 
...  

cmd1.Parameters.Add("@ProjectRegularHours",OleDbType.Decimal,19,4); 

for (int i = 0; i < Grid.RowCount; i++) 
{ 
    cmd1.Parameters["@Title"].Value = Grid.GetRowCellValue(i,"Title"); 
    ... 
    cmd1.Parameters["@ProjectRegularHours"].Value = (decimal)Grid.GetRowCellValue(i,"ProjectRegularHours")) 
    cmd1.ExecuteNonQuery(); 
} 

は同様に、より良いオプションがあります。グリッドでデータバインディングを使用してDataTableにバインドする場合は、OleDbTableAdapterを使用して一度にテーブル全体を書き込むことができます。

var range=sheet.LoadFromDataTable(myTable,true, TableStyles.Dark1); 

または

var range=sheet.LoadFromCollection(myListOfCustomers); 

アンより良いオプションは、ヘッダーやスタイリング、例えばと、1行を持つシートにすべてのデータテーブルまたはコレクションを書くことEPPlusのようなライブラリを使用することです

結果の範囲を名前付きテーブルに変換することもできます。

using (var xlPackage = new ExcelPackage(new FileInfo(somePath)) 
{ 
    // add a sheet 
    var ws = xlPackage.Workbook.Worksheets.Add("Sheet1"); 
    var table = ws.Tables.Add(range, "table1"); 
    table.ShowTotal = true; 
    table.TableStyle = TableStyles.Light2; 
    ... 
} 
+0

あなたのリプレイのおかげで皆に感謝します。しかし、このコードは私のためには機能しません –

関連する問題