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 ");
}
오픈 XML을 사용하려면, 당신은 당신의 기능 폴더 아래에 bin 폴더를 생성하고 그것에 DocumentFormat.OpenXml.dll 및 수 WindowsBase.dll을 업로드했는지 확인하시기 바랍니다.
"File contains corrupted data".
다른 Excel 파일을 사용하여 문제가 특정 Excel 파일과 관련이 있는지 확인해 보았습니까? 코드를 다시 테스트 할 수있는 새로운 간단한 Excel을 만드는 것이 좋습니다.
"It didn't work on my file with the same "File contains corrupted data" message. "
엑셀 파일을 다운로드하고 엑셀 파일의 이전 버전 (.xls)임을 확인했습니다.
예외를 수정하려면 Excel을 최신 버전 (.xlsx)으로 변환하거나 다른 Excel 구문 분석 라이브러리를 선택할 수 있습니다. ExcelDataReader은 모든 Excel 파일 버전에서 작동 할 수 있습니다. 'ExcelDataReader'를 검색하여 NuGet을 사용하여이 라이브러리를 설치할 수 있습니다. 다음은 .xls 형식의 파일을 구문 분석하는 방법에 대한 샘플 코드입니다. Azure Function에서 테스트했는데 정상적으로 작동했습니다.
#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의 대안을 추천 해 주실 수 있습니다. 감사합니다. – donquijote
의견에 감사드립니다. 귀하의 의견에 따라 답장을 업데이트했습니다. – Amor
이 용도로 설치되지 않은 글꼴은 어떻습니까? –