2016-05-17 14 views
2

現在Excelのスプレッドシートからセルを読み込もうとしていますが、それが望ましくないときにセルを再フォーマットするようです。私はそれが計画のテキストとして来ることを望みます。私はこの問題に対するいくつかの解決策を読んで、それらを実装しましたが、私はまだ同じ問題を抱えています。Excelから列を読み込み、セルを再フォーマットする

リーダーは数字と数字の日付を日付に変換します。

例:1900年2月9日午前12:00:00:42398

40.00がために出てくる:

2016年1月29日(金曜日)にあることを出てきます

コード:

string stringconn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + files[0] + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; 
try { 
    OleDbConnection conn = new OleDbConnection(stringconn); 
    OleDbDataAdapter da = new OleDbDataAdapter("SELECT * FROM [CUAnswers$]", conn); 
    DataTable dt = new DataTable(); 
    try { 
     printdt(dt); 

私はそれがExcelスプレッドシートを読み取るために相互運用機能を使用した以外、同様の問題があった。これは私がシートに

public void printdt(DataTable dt) { 
     int counter1 = 0; 
     int counter2 = 0; 
     string temp = ""; 
     foreach (DataRow dataRow in dt.Rows) { 
      foreach (var item in dataRow.ItemArray) { 
       temp += " ["+counter1+"]["+counter2+"]"+ item +", "; 
       counter2++; 
      } 
      counter1++; 
      logger.Debug(temp); 
      temp = ""; 
      counter2 = 0; 
     } 
    } 

答えて

1

をプリントアウトしています方法です

IMEX=0; 
HDR=NO; 
TypeGuessRows=1; 

を試してみました。これが私の仕事:

var value = (range.Cells[rowCnt, columnCnt] as Range).Value2; 
string str = value as string; 
DateTime dt; 
if (DateTime.TryParse((value ?? "").ToString(), out dt)) 
{ 
    // Use the cell value as a datetime 
} 

Editted私はカンマ区切りの値としてスプレッドシートを保存示唆するつもりだった

新しいアイデアを追加します。 Excelは、セルをテキストに変換します。 C#でCSVを解析するのは簡単です。

これは、プログラムで変換を行う方法を考えるのにつながりました。これはConvert xls to csv programmaticallyで説明されています。受け入れられた答えのコードは、あなたが探しているコードである可能性があります。

string ExcelFilename = "c:\\ExcelFile.xls"; 
DataTable worksheets; 
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;" + @"Data Source=" + ExcelFilename + ";" + @"Extended Properties=""Excel 8.0;HDR=Yes;IMEX=1"""; 
using (OleDbConnection connection = new OleDbConnection(connectionString)) 
{ 
    connection.Open(); 
    worksheets = connection.GetSchema("Tables"); 
    foreach (DataRow row in worksheets.Rows) 
    { 
     // For Sheets: 0=Table_Catalog,1=Table_Schema,2=Table_Name,3=Table_Type 
     // For Columns: 0=Table_Name, 1=Column_Name, 2=Ordinal_Position 
     string SheetName = (string)row[2]; 
     OleDbCommand command = new OleDbCommand(@"SELECT * FROM [" + SheetName + "]", connection); 
     OleDbDataAdapter oleAdapter = new OleDbDataAdapter(); 
     oleAdapter.SelectCommand = command; 
     DataTable dt = new DataTable(); 
     oleAdapter.FillSchema(dt, SchemaType.Source); 
     oleAdapter.Fill(dt); 
     for (int r = 0; r < dt.Rows.Count; r++) 
     { 
      string type1 = dr[1].GetType().ToString(); 
      string type2 = dr[2].GetType().ToString(); 
      string type3 = dr[3].GetType().ToString(); 
      string type4 = dr[4].GetType().ToString(); 
      string type5 = dr[5].GetType().ToString(); 
      string type6 = dr[6].GetType().ToString(); 
      string type7 = dr[7].GetType().ToString(); 
     } 
    } 
} 
+0

これは役に立ちません。私はそれを再変換したくない。私はそれが正しいフォーマットで細胞から出て来たい。または計画テキストとして使用することができます。 –

+0

セルを文字列として読み込みたい場合は、文字列として入力する必要があり、datetime(または何でも)として入力する必要はありません。可能であれば、スプレッドシートを変更し、それらのセルをテキストに変換する必要があります。値の前に単一引用符を付ける必要があります。 (これはおそらくあなたが望む答えではありません) –

+0

@Sari私の編集で新しいアイデアを見てください。 –

関連する問題