C# C防止excel自动将我的编号更改为最新
我目前正在尝试使用C将XLS文件转换为CSV文件,而不使用任何excel库。我已经设法将其从XLS转换为CSV,但我目前面临一个问题,即包含数字的行正在自动转换为datetime格式,因为上面的第一个单元格是datetime。我无法更改原始文件的格式 以下是我用于将xls转换为csv的代码: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
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。