C# C防止excel自动将我的编号更改为最新

C# C防止excel自动将我的编号更改为最新,c#,excel,C#,Excel,我目前正在尝试使用C将XLS文件转换为CSV文件,而不使用任何excel库。我已经设法将其从XLS转换为CSV,但我目前面临一个问题,即包含数字的行正在自动转换为datetime格式,因为上面的第一个单元格是datetime。我无法更改原始文件的格式 以下是我用于将xls转换为csv的代码: protected static void convertExcelToCsv(string inputFile, string outputFile) { int workshe

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

以下是我用于将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();
            }
        }


    }
问题 在IMEX模式下,默认情况下,驱动程序查看前几行8以确定列的格式。如果该列是混合的,则默认为文本。听起来,非日期数据只有在文件的下方才会出现

解决方案1 您可以通过修改注册表来增加它展望的行数:

HKEY\U LOCAL\U MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows

解决方案2 如果最后得到一个日期时间,并且希望将其转换为整数值,则可以使用

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

var d = /* DateTime from Excel */
int originalValue = d.Subtract(baseDate).TotalDays;
解决方案3
甩掉司机。改用。然后,您可以读取基础单元格值、格式化值或任何您想要的内容。

如果有其他方法可以将xls转换为csv,而无需使用任何excel库作为参考,请也共享!这可能有助于解决我的问题!如果知道如何读取值,则构造Select语句以强制执行返回的数据类型。i、 e.从Sheet1$中选择[F1],CDbl[F2]将强制第二列转换为Double类型。您好,John Wu,我无法使用解决方案1,因为我正在服务器中运行该程序。我测试了解决方案2,但转换后的整数与原始数字不同。例如,04/05/1900 00:00转换为124,而它应该是125。但是,对于日期如16/01/1900 00:00,它会正确地转换为16。至于解决方案3,我不能使用它,因为如果我是正确的,它需要在服务器中使用excel。上次我测试了excel interop,将其转换为csv,但没有成功。谢谢你向我解释这个问题!因为我不知道是什么问题!遗憾的是,我的非日期数据只出现在第12行:对于解决方案2,我建议使用。当然,这假定Excel使用1900日期系统,而不是1904系统。您知道如何将其反转以查找数字吗?可能使用DateTime.ToOADate。