0

我写了一个下载excel文件的代码。来自数据库的文件内容。代码在本地机器上工作,但部署在服务器上。Excel 文件在下载时损坏。我无法在我的代码中找到问题。请帮助我摆脱这个问题。第一种导出excel的方法和第二种在excelsheet中写入内容的方法。第二种方法由第一种方法调用。

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;
}
4

2 回答 2

0

对于 .xlsx,您应该使用以下内容类型:“application/vnd.openxmlformats-officedocument.spreadsheetml.sheet”。这解决了我的问题。

于 2013-07-18T17:47:11.577 回答
0

即使我被这个问题困扰了大约 1 周。最后,我解决了这个问题,并通过使用下面的代码得到了一个没有被破坏的 excel 输出。

我是作为一个 Maven 项目来做的。

在 pom.xml 文件中为 Super CSV Core » 2.4.0 添加以下依赖项

    <!-- 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();
        }
    }

使用它作为你的模型数据类

图书.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...
}

现在在服务器上运行此代码。在浏览器中点击网址。您的文件将毫无问题地下载。希望这会有所帮助!:)

于 2017-08-11T04:58:45.127 回答