从Excel中读取列,重新格式化单元格

时间:2016-05-17 13:20:36

标签: c# excel oledbconnection oledbdataadapter

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

读者将数字和数字中的日期转换为日期。

示例:

  

2016年1月29日星期五出现:42398

     

     

40.00出现:2/9/1900 12:00:00 AM

代码:

double

我试过了

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;

1 个答案:

答案 0 :(得分:1)

我有类似的问题,除了使用Interop阅读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
}

编辑以添加新想法

我打算建议将电子表格保存为以逗号分隔的值。然后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();
        }
    }
}