2016-05-17 127 views
2

我目前正在尝试从Excel电子表格中读取单元格,并且它在我不需要时似乎会重新格式化单元格。我希望它作为计划文本来完成。我已经阅读了几个针对这个问题的解决方案,并且已经实现了它们,但我仍然遇到同样的问题。从Excel中读取列,重新格式化单元格

阅读器将日期的数字和数字变成日期。

例子:

周五2016年1月29日出来是:42398

40.00出来是:1900年2月9日上午12点00分○○秒

代码:

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); 

我试图

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

这是我如何打印出的纸张

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

我也有类似的问题,但它是使用互操作来读取Excel电子表格。这为我工作:

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

在我看来,如果你想读一个单元格作为字符串,那么它需要输入为一个字符串,而不是一个日期时间(或其他)。您可能需要更改电子表格并将这些单元格转换为文本,可能需要用单引号将值加前缀。 (这可能不是你想要的答案。) –

+0

@Sari请在我的编辑中看到新的想法。 –