我正在使用这些连接字符串,具体取决于文件的扩展名:
public static string ExcelConnectionString(string filePath)
{
OleDbConnectionStringBuilder sbConnection = new OleDbConnectionStringBuilder();
String strExtendedProperties = String.Empty;
sbConnection.DataSource = filePath;
if (Path.GetExtension(filePath).Equals(".xls"))//for 97-03 Excel file
{
sbConnection.Provider = "Microsoft.Jet.OLEDB.4.0";
strExtendedProperties = "Excel 8.0";//HDR=ColumnHeader,IMEX=InterMixed
}
else if (Path.GetExtension(filePath).Equals(".xlsx")) //for 2007 Excel file
{
sbConnection.Provider = "Microsoft.ACE.OLEDB.12.0";
strExtendedProperties = "Excel 12.0";
}
sbConnection.Add("Extended Properties", strExtendedProperties);
return sbConnection.ToString();
}
但是,当我导入xls文件而不使用“另存为:2003 xls”或“另存为:xlsx”选项时。 (所以当我通过 control + s 保存我下载的文件时,它将无效。)我最终得到了这个错误:
用户代码未处理OleDbException - 外部表格未达到预期格式。
我该如何解决这个问题?我的系统需要使用 control + s 来保存文件,而不是手动选择其中一个。
问题可能是导出我*,因为当我在导出后手动打开文件时,我看到这个窗口:
The file you are trying to open "yourfile.xls" in a different format than specified file extension. Verify that the file is not corrupted and is from a trusted source before opening the file. Do you want to open the file now?
*导出文件是保存为.xls的生成的XML文件。 有什么办法可以在没有警告的情况下将其保存为.xls吗?我真的需要 control + s 来保存文件。
提前致谢。
简而言之: 如何在不收到上面显示的错误的情况下将创建的XML文件保存为XLS。 我不想使用外部库,只有在没有它们的情况下才真正做到这一点。
答案 0 :(得分:2)
您有大量证据表明该文件不实际上是以原生Excel格式保存的电子表格文件。换句话说,真正的 .xls或.xlsx文件。
所以你正在与一个糟糕的程序进行战斗,该程序只选择了错误的文件名,即转换XML文件的程序。这种程序的可能格式选择是.csv,逗号分隔值。 Excel知道如何阅读的格式。但是,您使用的OleDb提供程序并不那么聪明。它需要从连接字符串中知道真实的格式。
您确实需要知道文件实际包含的内容,以了解如何配置连接字符串。一个起点是查看文件的实际内容。使用十六进制查看器。如果您无法理解它,请发布截图。或者使用记事本,我的水晶球预测你会看到完全可读的文字。
首先是:
<?xml version="1.0"?><?mso-application progid="Excel.Sheet"?>
更新:文档格式化为XML文件,我可以通过使用“XML Spreadsheet 2003”格式保存电子表格来重新编写标题。预期的文件扩展名为.xml
。 OleDb提供程序无法按原样读取文档,因此需要进行转换。您可以编写一个小型控制台模式应用程序来处理它。项目+添加引用,COM选项卡,选择“Microsoft Excel x.x对象库”。使代码类似于:
using System;
using Excel = Microsoft.Office.Interop.Excel;
class Program {
[STAThread]
static int Main(string[] args) {
var app = new Excel.Application();
try {
if (args.Length != 2) throw new Exception("Usage: Convert inputfile outputfile");
var book = app.Workbooks.OpenXML(args[0]);
System.IO.File.Delete(args[1]);
book.SaveAs(args[1], FileFormat: Excel.XlFileFormat.xlExcel8);
app.Quit();
return 0;
}
catch (Exception ex) {
Console.WriteLine(ex.Message);
Console.ReadLine();
app.Quit();
return -1;
}
}
}
以防万一:确保查看该转换器的输出文件,而不是输入文件。
答案 1 :(得分:-1)
将97-03 Excel文件(“。xls”)的代码替换为以下
sbConnection.Provider = "Microsoft.ACE.OLEDB.12.0";
strExtendedProperties = "Excel 8.0";//HDR=ColumnHeader,IMEX=InterMixed
此连接字符串用于使用Office 2007 OLEDB驱动程序(ACE 12.0)连接到较旧的97-2003 Excel工作簿。