C#防止excel自动更改我的数字到目前为止

时间:2018-04-04 02:26:56

标签: c# excel

我目前正在尝试使用C#将XLS文件转换为CSV文件,而不使用任何excel库。我已设法将其从XLS转换为CSV但我目前面临的问题是,包含数字的行会自动转换为日期时间格式,因为上面的第一个单元格是日期时间。我无法更改原始文件的格式。

这是我用于将xls转换为csv的代码:

protected static void convertExcelToCsv(string inputFile, string outputFile)
    {

        int worksheetNumber = 1;

        var cnnStr = String.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;IMEX=1;HDR=NO\"", inputFile);
        var cnn = new OleDbConnection(cnnStr);

        var dt = new DataTable();

        cnn.Open();
        var schemaTable = cnn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);
        string worksheet = schemaTable.Rows[worksheetNumber - 1]["table_name"].ToString().Replace("'", "");
        string sql = String.Format("SELECT * FROM [{0}]", worksheet);
        var da = new OleDbDataAdapter(sql, cnn);



        da.Fill(dt);

        cnn.Close();

        using (var wtr = new StreamWriter(outputFile))
        {
            foreach (DataRow row in dt.Rows)
            {


                bool firstLine = true;
                foreach (DataColumn col in dt.Columns)
                {
                    if (!firstLine) { wtr.Write(","); } else { firstLine = false; }
                    var data = row[col.ColumnName].ToString().Replace(",", "");
                    wtr.Write(data);
                }
                wtr.WriteLine();
            }
        }


    }

1 个答案:

答案 0 :(得分:1)

问题

在IMEX模式下,驱动程序会查看前几行(默认为8行)以确定列的格式。如果列是“混合”,则默认为文本。听起来好像非日期数据直到文件中的下方才出现。

解决方案#1

您可以通过修改注册表来增加它预期的行数:

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows

解决方案#2

如果您最终使用DateTime并希望将其转换为整数值,则可以使用

readonly DateTime baseDate = new DateTime(1899,12,31);  //This is constant

var d = /* DateTime from Excel */
int originalValue = d.Subtract(baseDate).TotalDays;

解决方案#3

抛弃司机。请改用Excel interop。然后,您可以读取基础单元格值,格式化值或任何您想要的值。