Как создать и вернуть файл 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")
Другие вопросы по тегам