我目前正在尝试使用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();
}
}
}
答案 0 :(得分:1)
在IMEX模式下,驱动程序会查看前几行(默认为8行)以确定列的格式。如果列是“混合”,则默认为文本。听起来好像非日期数据直到文件中的下方才出现。
您可以通过修改注册表来增加它预期的行数:
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows
如果您最终使用DateTime
并希望将其转换为整数值,则可以使用
readonly DateTime baseDate = new DateTime(1899,12,31); //This is constant
var d = /* DateTime from Excel */
int originalValue = d.Subtract(baseDate).TotalDays;
抛弃司机。请改用Excel interop。然后,您可以读取基础单元格值,格式化值或任何您想要的值。