[英]Excel file get corrupted while downloading from server using java
我已經編寫了用於下載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;
}
對於.xlsx,您應該使用ContentType為:“ application / vnd.openxmlformats-officedocument.spreadsheetml.sheet”。 這為我解決了問題。
甚至我也被這個問題困擾了大約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();
}
}
將此用作模型數據類
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...
}
現在在服務器上運行此代碼。 在瀏覽器中點擊網址。 您的文件將被下載,沒有任何問題。 希望這會有所幫助! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.