Open XML SDKはAzure機能で正常に動作します。私は私の側でそれをテストしました。ここに完全なコードがあります。
#r "DocumentFormat.OpenXml.dll"
#r "WindowsBase.dll"
using System.Net;
using System.IO;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{
log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}");
WebClient client = new WebClient();
byte[] buffer = client.DownloadData("http://amor-webapp-test.azurewebsites.net/Content/hello.xlsx");
MemoryStream stream = new MemoryStream();
stream.Write(buffer, 0, buffer.Length);
stream.Position = 0;
using (SpreadsheetDocument doc = SpreadsheetDocument.Open(stream, false))
{
WorkbookPart workbookPart = doc.WorkbookPart;
SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
SharedStringTable sst = sstpart.SharedStringTable;
WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
Worksheet sheet = worksheetPart.Worksheet;
var cells = sheet.Descendants<Cell>();
var rows = sheet.Descendants<Row>();
log.Info(string.Format("Row count = {0}", rows.LongCount()));
log.Info(string.Format("Cell count = {0}", cells.LongCount()));
// One way: go through each cell in the sheet
foreach (Cell cell in cells)
{
if ((cell.DataType != null) && (cell.DataType == CellValues.SharedString))
{
int ssid = int.Parse(cell.CellValue.Text);
string str = sst.ChildElements[ssid].InnerText;
log.Info(string.Format("Shared string {0}: {1}", ssid, str));
}
else if (cell.CellValue != null)
{
log.Info(string.Format("Cell contents: {0}", cell.CellValue.Text));
}
}
}
return req.CreateResponse(HttpStatusCode.OK, "Hello ");
}
がOpen XMLを使用するには、あなたがあなたの関数フォルダの下のbinフォルダを作成し、それにDocumentFormat.OpenXml.dllとWindowsBase.dllをアップロードしていることを確認してください。
"File contains corrupted data".
別のエクセルファイルを試して、問題が特定のエクセルファイルに関連しているかどうかを確認しましたか?私はあなたのコードを再度テストするための新しい簡単なエクセルを作成することをお勧めします。
"It didn't work on my file with the same "File contains corrupted data" message. "
Excelファイルをダウンロードして、それがExcelファイルの古いバージョン(.xls)であることが判明しました。
例外を修正するには、Excelを最新バージョン(.xlsx)に変換するか、別のExcel解析ライブラリを選択します。 ExcelDataReaderは任意のバージョンのExcelファイルで動作します。このライブラリをインストールするには、NuGetを使用して 'ExcelDataReader'を検索します。以下は、.xls形式のファイルを解析する方法のサンプルコードです。 Azure関数でテストしましたが、うまくいきました。
#r "Excel.dll"
#r "System.Data"
using System.Net;
using System.IO;
using Excel;
using System.Data;
public static HttpResponseMessage Run(HttpRequestMessage req, TraceWriter log)
{
log.Info($"C# HTTP trigger function processed a request. RequestUri={req.RequestUri}");
WebClient client = new WebClient();
byte[] buffer = client.DownloadData("http://amor-webapp-test.azurewebsites.net/Content/abcdefg.xls");
MemoryStream stream = new MemoryStream();
stream.Write(buffer, 0, buffer.Length);
stream.Position = 0;
IExcelDataReader excelReader = ExcelReaderFactory.CreateBinaryReader(stream);
DataSet result = excelReader.AsDataSet();
for (int i = 0; i < result.Tables.Count; i++)
{
log.Info(result.Tables[i].TableName +" has " + result.Tables[i].Rows.Count + " rows.");
}
return req.CreateResponse(HttpStatusCode.OK, "Hello ");
}
上部のコードを実行する前に、あなたの関数のbinフォルダに "Excel.dll" ファイルを追加してください。
詳細なコードをありがとう。同じ "ファイルには破損したデータが含まれています"というメッセージが表示され、ファイル上で動作しませんでした。この時点で、私の問題のAzure関数の側面は明らかに解決されています。私はファイルをダウンロードしてExcelで開くことができました。また、Office interop COMを使用してローカルで正しくダウンロード、読み取り、解析することもできました。この時点で、OpenXMLに問題がある可能性があります。私のファイルでテストすることができれば幸いです:http://www2.nationalgrid.com/WorkArea/DownloadAsset.aspx?id=8589936879、あるいはOpenXMLの代替案をお勧めしたいのであれば、ありがとうございましたvm – donquijote
ご意見ありがとうございます。あなたのコメントに基づいて返信を更新しました。 – Amor
このためにインストールされていないフォントについてはどうですか? –