我试图从共享点网站上的 Excel 文件 URL 中获取数据并将其放入数据数据表中,但出现此错误:
输入流不是有效的二进制格式。起始内容(以字节为单位)为:50-4B........
这是我正在使用的代码:-
WebClient webClient = new WebClient();
webClient.Credentials = CredentialCache.DefaultNetworkCredentials;
byte[] data = webClient.DownloadData("http://sp2010sw127:2000/eur/Home/TestLibrary/Details.xlsx");
MemoryStream memoryStreamOfFile = new MemoryStream(data);
BinaryFormatter formatter = new BinaryFormatter();
memoryStreamOfFile.Seek(0, SeekOrigin.Begin);
DataTable dt = (DataTable)formatter.Deserialize(memoryStreamOfFile);
请指教。
不应使用二进制格式化程序。很危险。
您下载的数据是Excel电子表格;这与 DataTable 完全不同;当您尝试执行以下操作时:
DataTable dt = (DataTable)formatter.Deserialize(memoryStreamOfFile);
然后您尝试将表示 Excel 电子表格的字节流反序列化为 DataTable 对象,这是不可能的。
您可以先下载文件:
WebClient webClient = new WebClient();
webClient.Credentials = CredentialCache.DefaultNetworkCredentials;
webClient.DownloadFile(
"http://sp2010sw127:2000/eur/Home/TestLibrary/Details.xlsx",
"C:\\Details.xlsx");
然后使用下面的方法(我根据我的答案这里定制的):
DataTable myData = LoadFromExcelFile("C:\\Details.xlsx");
请注意,您需要考虑更合适的位置来保存文件,并且您还需要查看
SELECT
查询以从工作表中获取所需的列(在下面的示例中名为 [Sheet1$]
) ).
public DataTable LoadFromExcelFile(string filePath)
{
String excelConnString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0\"", filePath);
//Create Connection to Excel work book
using (OleDbConnection excelConnection = new OleDbConnection(excelConnString))
{
//Create OleDbCommand to fetch data from Excel - you can query the sheet as if it were a sql table effectively
using (OleDbCommand cmd = new OleDbCommand("SELECT [Column1],[Column2],[Column3] from [Sheet1$]", excelConnection))
{
excelConnection.Open();
using (OleDbDataReader dReader = cmd.ExecuteReader())
{
DataTable myData = new DataTable();
myData.Load(dReader);
return myData;
}
}
}
}