java report.xlsx 的文件格式和扩展名不匹配
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29705422/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
File Format and extension of the report.xlsx don't match
提问by phemanthkumar28
The Servlet and DAO code looks like below:
Servlet 和 DAO 代码如下所示:
@WebServlet("/ExcelExportController")
public class ExcelExportController extends HttpServlet {
private static final long serialVersionUID = 1L;
/**
* @see HttpServlet#HttpServlet()
*/
public ExcelExportController() {
super();
// TODO Auto-generated constructor stub
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
* response)
*/
@SuppressWarnings("unchecked")
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// TODO Auto-generated method stub
HttpSession session = request.getSession();
if (session != null) {
FileOutputStream fileOut;
List<LoanOffersDTO> loanOffersDTOs;
ExcelExportDAO excelExportDAO;
HSSFWorkbook hssfWorkbook;
if (session.getAttribute("loanOffers") != null) {
loanOffersDTOs = (List<LoanOffersDTO>) session
.getAttribute("loanOffers");
excelExportDAO = new ExcelExportDAOImpl();
hssfWorkbook = excelExportDAO
.createLoanOffersXls(loanOffersDTOs);
if (hssfWorkbook != null) {
fileOut = new FileOutputStream("report.xlsx");
response.setContentType("application/application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition",
"attachment; filename=report.xlsx");
hssfWorkbook.write(fileOut);
fileOut.flush();
fileOut.close();
} else {
}
}
}
}
}
public class ExcelExportDAOImpl implements ExcelExportDAO {
@Override
public HSSFWorkbook createLoanOffersXls(List<LoanOffersDTO> loanOffersDTOs) throws IOException {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("LoanOffer");
HSSFRow headRow = sheet.createRow(0);
headRow.createCell(0).setCellValue("Bank Name");
headRow.createCell(1).setCellValue("Offer Name");
headRow.createCell(2).setCellValue("Loan Officer");
headRow.createCell(3).setCellValue("Telephone");
headRow.createCell(4).setCellValue("Email");
headRow.createCell(5).setCellValue("Interest Rate");
headRow.createCell(6).setCellValue("Period");
headRow.createCell(7).setCellValue("Pre-Payment");
headRow.createCell(8).setCellValue("Installment");
headRow.createCell(9).setCellValue("Loan details");
HSSFRow dataRow;
int rowCount = 1;
for (LoanOffersDTO loanOffersDTO : loanOffersDTOs) {
dataRow = sheet.createRow(rowCount++);
dataRow.createCell(0).setCellValue(loanOffersDTO.getBankName());
dataRow.createCell(1).setCellValue(loanOffersDTO.getOfferName());
dataRow.createCell(2).setCellValue(
loanOffersDTO.getLoanOfficerName());
dataRow.createCell(3).setCellValue(
loanOffersDTO.getBankerContactNum());
dataRow.createCell(4)
.setCellValue(loanOffersDTO.getBankerEmailId());
dataRow.createCell(5).setCellValue(loanOffersDTO.getInterestRate());
dataRow.createCell(6).setCellValue(loanOffersDTO.getDuration());
dataRow.createCell(7).setCellValue(
loanOffersDTO.getPrePaymentValue());
dataRow.createCell(8).setCellValue(loanOffersDTO.getInstallments());
dataRow.createCell(9).setCellValue(
loanOffersDTO.getLoanDescription());
}
FileOutputStream fileOut = new FileOutputStream("C:\Users\Test\Desktop\report_"+Calendar.getInstance().getTimeInMillis()+".xls");
workbook.write(fileOut);
fileOut.flush();
fileOut.close();
return workbook;
}
}
Summary:
概括:
I have a jsp, when it is submitted the above servlet/controller is called.This sevelet would create the excel file and flush the Excel. Here the excel file is created using "apache poi". The excel gets created and flushed out, on trying to open it I'm seeing the error "File Format and extension of the report.xlsx don't match." with no data. But if I try to flush same file to some particular location, I'm receiving the file perfectly. I have even tried with content type as "application/vnd.ms-excel" but issue is same. Thanks
我有一个jsp,当它被提交时,上面的servlet/控制器被调用。这个sevelet 将创建excel 文件并刷新Excel。这里的excel文件是使用“apache poi”创建的。excel 被创建并刷新,在尝试打开它时,我看到错误“report.xlsx 的文件格式和扩展名不匹配”。没有数据。但是,如果我尝试将同一文件刷新到某个特定位置,我将完美地接收到该文件。我什至尝试将内容类型设为“application/vnd.ms-excel”,但问题是一样的。谢谢
回答by Gagravarr
You seem to have two problems. One is that you're using the HSSF code which generates .xls
files, but sending a .xlsx
style response. Secondly, you're writing the workbook to a file on the server, not sending it back to the client!
你似乎有两个问题。一是您使用的是生成.xls
文件的 HSSF 代码,但发送的是.xlsx
样式响应。其次,您将工作簿写入服务器上的文件,而不是将其发送回客户端!
I'd suggest changing your code to be generic to handle both, something like
我建议将您的代码更改为通用来处理两者,例如
Workbook workbook;
....
workbook = excelExportDAO.createLoanOffersXls(loanOffersDTOs);
if (workbook != null) {
if (workbook instanceof HSSFWorkbook) {
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition",
"attachment; filename=report.xls");
} else {
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setHeader("Content-Disposition",
"attachment; filename=report.xlsx");
}
OutputStream out = response.getOutputStream();
hssfWorkbook.write(out);
out.close();
}