2017-08-12 36 views
0

我正在從ftp中獲取Excel文件並在內存流中獲取該文件。我必須從內存流中讀取該文件。我到Excel互操作嘗試,但它不接受內存流作爲參數在在C#控制檯應用程序中從內存流中讀取Excel文件

xlWorkBook = xlApp.Workbooks.Open(strm, 0, true, 5, "", "", true, 
    Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0); 

根據系統的要求,即無法保存該文件臨時;因爲我正在使用Azure Web作業進行控制檯應用程序部署。有什麼辦法從內存流中讀取文件,或者我可以將內存流轉換爲字符串數組嗎?

+1

如果您使用的是Office互操作庫,則無法將Excel文件加載到Stream中。實際上,您可能不應該在Azure上使用該庫。還有其他的圖書館會爲你做這個。 – DavidG

+0

@DavidG可以給我建議其他圖書館,將幫助完整。 –

回答

0

我建議您使用ExcelDataReader 3.1.0從Excel文件讀取數據。
現在你可以使用MemoryStreamExcelReader這樣的:
注意的舊Excel文件閱讀器 - .xls - 是不同的形式較新的文件 - .xlsx - 。

var excelReader = originalFileName.EndsWith(".xls") 
       ? ExcelReaderFactory.CreateBinaryReader(stream) 
       : ExcelReaderFactory.CreateOpenXmlReader(stream); 

如果你想提取從一個stringMemoryStream你可以使用一個StreamReader

var streamReader = new StreamReader(memoryStream); 
var stringResult = streamReader.ReadToEnd(); 

如果你想工作在FileStream您可以MemoryStream複製到它是這樣的:

memoryStream.CopyTo(fileStream); 
0

另外EasyXLS接受流,包括MemoryStream。 我不知道,如果你需要從Excel,或其他信息,僅細胞的數據,但代碼波紋管是僅用於數據:

ExcelDocument excelWorkbook = new ExcelDocument(); 
DataSet ds = excelWorkbook.easy_ReadXLSActiveSheet_AsDataSet(memoryStream); 

更多細節關於閱讀擅長,你可以找到在這個位置: https://www.easyxls.com/manual/FAQ/read-excel-file-in-dot-net.html

0

Azure Webjob中沒有MS Office,因此我們無法在Azure Webjob中使用Microsoft.Office.Interop Dll。請嘗試使用DocumentFormat.OpenXml來做到這一點。以下是official document的演示代碼。我還找到關於如何Read and Write Microsoft Excel with Open XML SDK的另一個教程。

public static void OpenAndAddToSpreadsheetStream(Stream stream) 
{ 
    // Open a SpreadsheetDocument based on a stream. 
    SpreadsheetDocument spreadsheetDocument = 
     SpreadsheetDocument.Open(stream, true); 

    // Add a new worksheet. 
    WorksheetPart newWorksheetPart = spreadsheetDocument.WorkbookPart.AddNewPart<WorksheetPart>(); 
    newWorksheetPart.Worksheet = new Worksheet(new SheetData()); 
    newWorksheetPart.Worksheet.Save(); 

    Sheets sheets = spreadsheetDocument.WorkbookPart.Workbook.GetFirstChild<Sheets>(); 
    string relationshipId = spreadsheetDocument.WorkbookPart.GetIdOfPart(newWorksheetPart); 

    // Get a unique ID for the new worksheet. 
    uint sheetId = 1; 
    if (sheets.Elements<Sheet>().Count() > 0) 
    { 
     sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1; 
    } 

    // Give the new worksheet a name. 
    string sheetName = "Sheet" + sheetId; 

    // Append the new worksheet and associate it with the workbook. 
    Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName }; 
    sheets.Append(sheet); 
    spreadsheetDocument.WorkbookPart.Workbook.Save(); 

    // Close the document handle. 
    spreadsheetDocument.Close(); 

    // Caller must close the stream. 
} 
相關問題