2013-06-24 5 views
0

Я написал код для загрузки файла excel. Файл, полученный из базы данных. Код работает на локальной машине, но при развертывании на сервере. Файл Excel становится загруженным во время загрузки. Я не могу найти проблему в своем коде. Пожалуйста, помогите мне избавиться от этой проблемы. Первый метод для экспорта Excel и второго метода для записи содержимого в excelsheet. И второй метод называется первым методом.Файл Excel поврежден при загрузке с сервера с помощью java

public static void doGetExportException(String sheetId, ResourceRequest resourceRequest, ResourceResponse resourceResponse) throws ServletException, IOException 
{ 


    HttpServletResponse response = PortalUtil.getHttpServletResponse(resourceResponse); 
    try 
    { 
     long maxSheetId = Long.parseLong(sheetId); 
     System.out.println("maxSheetId="+maxSheetId); 
     List<Customer_Exception> lstCustomer_Exceptions =UploadExcelUtil.getCustomerExceptions(maxSheetId); 

     XSSFWorkbook outPutSheet= writeExcelsheet(lstCustomer_Exceptions); 

     ByteArrayOutputStream outByteStream = new ByteArrayOutputStream(); 
     outPutSheet.write(outByteStream); 
     byte [] outArray = outByteStream.toByteArray(); 

     String fileName = "Download_"+new Date(new java.util.Date().getTime())+".xlsx"; 
     response.setContentType("application/ms-excel; charset=UTF-8"); 
     response.setContentLength(outArray.length); 
     response.setHeader("Expires:", "0"); 
     response.addHeader(HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate"); 
     response.addHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename="+fileName); 
     response.addHeader(HttpHeaders.CONTENT_ENCODING, "Binary"); 
     OutputStream outStream = response.getOutputStream(); 
     outStream.write(outArray); 
     outStream.flush(); 
     outStream.close(); 
    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 
} 

private static XSSFWorkbook writeExcelsheet(List<Customer_Exception> lstCustomer_Exceptions) { 
    XSSFWorkbook workbook = new XSSFWorkbook(); 
    XSSFSheet sheet = workbook.createSheet("Exceptions"); 

    CellStyle styleHeader = workbook.createCellStyle(); 
    XSSFFont fontHeader = workbook.createFont(); 
    XSSFColor color = new XSSFColor(Color.BLACK); 
    fontHeader.setColor(color); 
    fontHeader.setBold(true); 
    fontHeader.setFontHeight(13); 
    styleHeader.setFont(fontHeader); 
    sheet.createFreezePane(0, 1); 
    CellStyle styleData = workbook.createCellStyle(); 
    XSSFFont fontData = workbook.createFont(); 
    fontData.setColor(color); 
    fontData.setFontHeight(12); 
    styleData.setFont(fontData); 

    int rownum = 0; 
    XSSFRow rowHeader = sheet.createRow(rownum++); 
    List<String> lstCellHeaders =getCellHeaders(); 
    int cellnum = 0; 
    for(String cellHeader:lstCellHeaders){ 
     XSSFCell cell = rowHeader.createCell(cellnum++); 
     cell.setCellStyle(styleHeader); 
     cell.setCellValue((String)cellHeader); 

    } 



    for (Customer_Exception customer_Exception:lstCustomer_Exceptions) { 
     List<String> lstCellValues =getCellValues(customer_Exception); 
     XSSFRow rowData = sheet.createRow(rownum++); 

     cellnum = 0; 
     for(String cellValue:lstCellValues){ 
      XSSFCell cell = rowData.createCell(cellnum++); 
      cell.setCellStyle(styleData); 
      cell.setCellValue((String)cellValue); 

     } 
    } 
    return workbook; 
} 
+1

Любые исключения, происходящие на стороне сервера/клиента? Захват всех исключений - это плохая практика, если вы не можете обрабатывать/восстанавливать из-за ошибки во время обработки запроса, вы должны ее восстановить (возможно, завернутый) или ответить соответствующим HTTP-кодом (например, 500). – Pyranja

+0

Я добавил улов, чтобы узнать о проблемах во время загрузки и хочу показать правильное имя пользователя. – user2515040

+0

У меня было решение. Я удалил «response.addHeader» (HttpHeaders.CONTENT_ENCODING, «Binary»); то его рабочий штраф – user2515040

ответ

0

Для .xlsx вы должны использовать ContentType из: "приложения/vnd.openxmlformats-officedocument.spreadsheetml.sheet". Это исправило проблему для меня.

0

Даже я застрял в этом вопросе около 1 недели. Наконец, я решил проблему и получил выход excel, не будучи поврежденным, используя приведенный ниже код.

Я сделал это как проект maven.

Добавьте следующую зависимость для Супер CSV Ядра »2.4.0 в вашем pom.xml файл

<!-- https://mvnrepository.com/artifact/net.sf.supercsv/super-csv --> 
<dependency> 
    <groupId>net.sf.supercsv</groupId> 
    <artifactId>super-csv</artifactId> 
    <version>2.4.0</version> 
</dependency> 

Теперь используйте следующий код для класса контроллера

CSVFileDownloadController .java

import java.io.IOException; 
import java.util.Arrays; 
import java.util.List; 

import javax.servlet.http.HttpServletResponse; 

import org.springframework.stereotype.Controller; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.supercsv.io.CsvBeanWriter; 
import org.supercsv.io.ICsvBeanWriter; 
import org.supercsv.prefs.CsvPreference; 

import com.rapidvalue.master.employee.vo.Book; 

@Controller 
public class CSVFileDownloadController { 
     @RequestMapping(value = "/downloadCSV") 
     public void downloadCSV(HttpServletResponse response) throws IOException { 

      String csvFileName = "books.csv"; 

      response.setContentType("text/csv"); 

      // creates mock data 
      String headerKey = "Content-Disposition"; 
      String headerValue = String.format("attachment; filename=\"%s\"", 
        csvFileName); 
      response.setHeader(headerKey, headerValue); 

      Book book1 = new Book("Effective Java", "Java Best Practices", 
        "Joshua Bloch", "Addision-Wesley", "0321356683", "05/08/2008", 
        38); 

      Book book2 = new Book("Head First Java", "Java for Beginners", 
        "Kathy Sierra & Bert Bates", "O'Reilly Media", "0321356683", 
        "02/09/2005", 30); 

      Book book3 = new Book("Thinking in Java", "Java Core In-depth", 
        "Bruce Eckel", "Prentice Hall", "0131872486", "02/26/2006", 45); 

      Book book4 = new Book("Java Generics and Collections", 
        "Comprehensive guide to generics and collections", 
        "Naftalin & Philip Wadler", "O'Reilly Media", "0596527756", 
        "10/24/2006", 27); 

      List<Book> listBooks = Arrays.asList(book1, book2, book3, book4); 

      // uses the Super CSV API to generate CSV data from the model data 
      ICsvBeanWriter csvWriter = new CsvBeanWriter(response.getWriter(), 
        CsvPreference.STANDARD_PREFERENCE); 

      String[] header = { "Title", "Description", "Author", "Publisher", 
        "isbn", "PublishedDate", "Price" }; 

      csvWriter.writeHeader(header); 

      for (Book aBook : listBooks) { 
       csvWriter.write(aBook, header); 
      } 

      csvWriter.close(); 
     } 
    } 

Используйте это в качестве класса данных модели

Book.java

public class Book { 
    private String title; 
    private String description; 
    private String author; 
    private String publisher; 
    private String isbn; 
    private String publishedDate; 
    private float price; 

    public Book() { 
    } 

    public Book(String title, String description, String author, String publisher, 
      String isbn, String publishedDate, float price) { 
     this.title = title; 
     this.description = description; 
     this.author = author; 
     this.publisher = publisher; 
     this.isbn = isbn; 
     this.publishedDate = publishedDate; 
     this.price = price; 
    } 

    // getters and setters... 
} 

Теперь запустите этот код на сервере. Нажмите на URL в браузере. Ваш файл будет загружен без каких-либо проблем. Надеюсь, это поможет! :)

Смежные вопросы