report.xlsx 的文件格式和扩展名不匹配
File Format and extension of the report.xlsx don't match
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;
}
}
总结:
我有一个 jsp,提交时上面的 servlet/controller 是 called.This sevelet 将创建 excel 文件并刷新 Excel。这里 excel 文件是使用 "apache poi" 创建的。
excel 被创建并清除,在尝试打开它时我看到没有数据的错误 "File Format and extension of the report.xlsx don't match."。但是,如果我尝试将同一个文件刷新到某个特定位置,我就会完美地接收到该文件。
我什至尝试过将内容类型设置为 "application/vnd.ms-excel" 但问题是一样的。
谢谢
你好像有两个问题。一是您使用的是生成 .xls
文件的 HSSF 代码,但发送的是 .xlsx
样式的响应。其次,您是将工作簿写入服务器上的文件,而不是将其发送回客户端!
我建议将您的代码更改为通用代码以处理这两者,例如
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();
}
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;
}
}
总结:
我有一个 jsp,提交时上面的 servlet/controller 是 called.This sevelet 将创建 excel 文件并刷新 Excel。这里 excel 文件是使用 "apache poi" 创建的。 excel 被创建并清除,在尝试打开它时我看到没有数据的错误 "File Format and extension of the report.xlsx don't match."。但是,如果我尝试将同一个文件刷新到某个特定位置,我就会完美地接收到该文件。 我什至尝试过将内容类型设置为 "application/vnd.ms-excel" 但问题是一样的。 谢谢
你好像有两个问题。一是您使用的是生成 .xls
文件的 HSSF 代码,但发送的是 .xlsx
样式的响应。其次,您是将工作簿写入服务器上的文件,而不是将其发送回客户端!
我建议将您的代码更改为通用代码以处理这两者,例如
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();
}