我制作了一个mvc应用程序,它将excel文件保存在azure blob blob存储上。现在我想阅读这个excel文件的内容。
之前我将此文件保存在我的c:/ temp文件夹中,并将代码批量复制,如下所示: -
string excelConnectionString = string.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 12.0 Xml;HDR=YES;""", path);
OleDbConnection connection = new OleDbConnection();
connection.ConnectionString = excelConnectionString;
OleDbCommand command = new OleDbCommand("select * from [Sheet1$]", connection);
connection.Open();
DbDataReader dr = command.ExecuteReader();
using (var bulkCopy = new SqlBulkCopy(ConfigurationManager.ConnectionStrings["myString"].ConnectionString, SqlBulkCopyOptions.KeepNulls & SqlBulkCopyOptions.KeepIdentity))
{
//my logic
}
connection.Close();
因为我想在Azure云上实现此解决方案。
现在我将excel文件保存到Azure blobstorage而不是c:/ temp。 但我无法对其进行批量复制。
请提出建议。
答案 0 :(得分:0)
Microsoft.ACE.OLEDB.12.0是安装Microsoft Office的驱动程序。任何Azure计算机上都没有安装Office。为了阅读Excel文件,我建议您使用OpenXML SDK或其周围的一些包装,如OpenExcel或ClosedXML。如果您需要阅读早于2007年的Excel文件格式,则无法在云中执行此操作。
其余的: 其他一切(BulkInsert等)都可以。 经验法则 - 一般来说,在Web编程中,在任何编程中,都不要依赖固定/硬编码路径!
在本地保存文件,然后批量复制它。
对于Web方案,对于任何环境(不仅仅是Azure),您至少有两个选项可以选择本地路径来保存blob中的文件:
在磁盘上创建一个唯一命名的零字节临时文件并返回 该文件的完整路径。
我个人更喜欢后者 - Server.MapPath
,用法如下:
var localPath = Server.MapPath("~/tmp");
var fileName = "name_of_my_file.xlsx";
var fullPathToFile = System.IO.Path.Combine(localPath, fileName);
这将在我的Web应用程序中的“tmp”文件夹中提供可写文件的完整路径,该文件夹位于我的Web应用程序根目录中。我也可以使用配置(web.config)阻止对该文件夹的所有外部访问,这样它只能被后端访问(控制器动作,代码等)。
使用前者(System.IO.Path.GetTempFilename)将为您提供System TEMP文件夹中的唯一文件。我不会在任何系统中使用它 - TEMP文件夹是任何进程可以读取和写入的文件夹。
如果您不知道如何从Blob下载文件,请阅读this tutorial中的How to: Download blobs
。