Как создать и вернуть файл Excel с контроллером в MVC 4 в vb.net?
Я использую ExcelLibrary введите описание ссылки здесь, потому что я не хочу устанавливать Microsoft Office Excel (microsoft.interop.office.excel)
Public Function ObtenerExcel() As ActionResult
Dim workbook As New Workbook()
Dim worksheet As New Worksheet("Sheet1")
worksheet.Cells(5, 5) = New Cell(999999)
worksheet.Cells(10, 10) = New Cell(12354)
workbook.Worksheets.Add(worksheet)
Dim stream As New System.IO.MemoryStream
workbook.SaveToStream(stream)
stream.Position = 0
Dim buffer(4096) As Byte
stream.Read(buffer, 0, buffer.Length)
Return File(buffer, "application/vnd.ms-excel", "mytestfile.xls")
End Function
Этот код возвращает файл Excel, но когда я пытаюсь открыть этот файл, он показывает сообщение об ошибке (Excel обнаружил нечитаемый контент в "text.xls". Хотите восстановить содержимое этой книги? Если вы доверяете источнику эту книгу, нажмите Да.) и она ничего не показывает.
Я работаю на Windows 8.1 (64 бит) и Microsoft Office 2013
2 ответа
Что ж. Я нашел решение, я думаю, что эта проблема размером с файл Excel, но я не уверен в этом. Итак, я нашел это "решение": когда я создаю свою книгу, я заполняю 200 ячеек первого листа нулевыми значениями, чтобы достичь этого размера.
Public Function ObtenerExcel() As ActionResult
Dim stream As New System.IO.MemoryStream
Dim doc As CompoundDocument = CompoundDocument.Create(stream)
Dim memStream As New MemoryStream
Dim workbook As New Workbook()
Dim worksheet As New Worksheet("Hoja")
For Index As Integer = 0 To 200
worksheet.Cells(Index, 0) = New Cell(Nothing)
Next
workbook.Worksheets.Add(worksheet)
workbook.SaveToStream(stream)
stream.Position = 0
Return File(stream, "application/vnd.ms-excel", "mytestfile.xls")
End Function
Вы должны использовать Перегрузку потока Файла (...). Код, который вы написали, похоже, возвращает только первые 4096 байт файла, то есть количество, которое вы скопировали в буфер. Вместо этого вы должны использовать поток напрямую.
Dim stream As New System.IO.MemoryStream
workbook.SaveToStream(stream)
stream.Position = 0
Return File(stream, "application/vnd.ms-excel", "mytestfile.xls")