从 GWT 客户端下载 Excel 文件
Download Excel file from GWT client
我需要在我的 GWT 应用程序上从客户端生成一个 xls 文件(在服务器端使用 apache-poi 生成)。
我希望当用户点击一个按钮时,会出现一个文件选择器,允许他保存生成的文件。
首先,我创建了我的 servlet:
public class DownloadServlet extends HttpServlet
{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
// What I have to insert here?!
}
public void getXlsFile()
{
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Datatypes in Java");
Object[][] datatypes = { { "Datatype", "Type", "Size(in bytes)" }, { "int", "Primitive", 2 }, { "float", "Primitive", 4 }, { "double", "Primitive", 8 }, { "char", "Primitive", 1 }, { "String", "Non-Primitive", "No fixed size" } };
int rowNum = 0;
for (Object[] datatype : datatypes) {
Row row = sheet.createRow(rowNum++);
int colNum = 0;
for (Object field : datatype) {
Cell cell = row.createCell(colNum++);
if( field instanceof String ) {
cell.setCellValue((String) field);
}
else if( field instanceof Integer ) {
cell.setCellValue((Integer) field);
}
}
}
try {
FileOutputStream outputStream = new FileOutputStream("MyFirstExcel.xlsx");
workbook.write(outputStream);
workbook.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
现在的问题是:
- 如何填写 doGet 方法?
- 我如何从客户端调用这个 servlet?
请注意,客户端我不知道 xls 文件路径,因为我想在服务器端创建 xls 文件 "on the fly"。
您已经创建了一个 servlet 并准备好您的 xls 文件。您所要做的就是将数据推送到 HttpServletResponse
对象中。
首先,您不需要保存文件。将 getXlsFile()
方法更改为 return XSSFWorkbook
并删除末尾的 try / catch
块。
现在,doGet
方法:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HSSFWorkbook workbook = getXlsFile();
String fileName = "MyFirstExcel.xlsx";
resp.setStatus(HttpServletResponse.SC_OK);
resp.setHeader("Content-disposition", "attachment; filename=\"" + fileName + "\"");
resp.setContentType("application/vnd.ms-excel");
resp.getOutputStream().write(workbook.getBytes());
resp.getOutputStream().close();
resp.flushBuffer();
workbook.close();
}
如何调用服务器?
您需要在 web.xml
文件中添加 servlet 映射:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>fully.qualified.className</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/path/to/the/servlet</url-pattern>
</servlet-mapping>
简而言之:servlet 映射映射 url 到servlet class。因此,当您打开 /path/to/the/servlet
时,将调用 fully.qualified.className
servlet。
我需要在我的 GWT 应用程序上从客户端生成一个 xls 文件(在服务器端使用 apache-poi 生成)。 我希望当用户点击一个按钮时,会出现一个文件选择器,允许他保存生成的文件。
首先,我创建了我的 servlet:
public class DownloadServlet extends HttpServlet
{
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
// What I have to insert here?!
}
public void getXlsFile()
{
XSSFWorkbook workbook = new XSSFWorkbook();
XSSFSheet sheet = workbook.createSheet("Datatypes in Java");
Object[][] datatypes = { { "Datatype", "Type", "Size(in bytes)" }, { "int", "Primitive", 2 }, { "float", "Primitive", 4 }, { "double", "Primitive", 8 }, { "char", "Primitive", 1 }, { "String", "Non-Primitive", "No fixed size" } };
int rowNum = 0;
for (Object[] datatype : datatypes) {
Row row = sheet.createRow(rowNum++);
int colNum = 0;
for (Object field : datatype) {
Cell cell = row.createCell(colNum++);
if( field instanceof String ) {
cell.setCellValue((String) field);
}
else if( field instanceof Integer ) {
cell.setCellValue((Integer) field);
}
}
}
try {
FileOutputStream outputStream = new FileOutputStream("MyFirstExcel.xlsx");
workbook.write(outputStream);
workbook.close();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}
catch (IOException e) {
e.printStackTrace();
}
}
}
现在的问题是:
- 如何填写 doGet 方法?
- 我如何从客户端调用这个 servlet?
请注意,客户端我不知道 xls 文件路径,因为我想在服务器端创建 xls 文件 "on the fly"。
您已经创建了一个 servlet 并准备好您的 xls 文件。您所要做的就是将数据推送到 HttpServletResponse
对象中。
首先,您不需要保存文件。将 getXlsFile()
方法更改为 return XSSFWorkbook
并删除末尾的 try / catch
块。
现在,doGet
方法:
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HSSFWorkbook workbook = getXlsFile();
String fileName = "MyFirstExcel.xlsx";
resp.setStatus(HttpServletResponse.SC_OK);
resp.setHeader("Content-disposition", "attachment; filename=\"" + fileName + "\"");
resp.setContentType("application/vnd.ms-excel");
resp.getOutputStream().write(workbook.getBytes());
resp.getOutputStream().close();
resp.flushBuffer();
workbook.close();
}
如何调用服务器?
您需要在 web.xml
文件中添加 servlet 映射:
<servlet>
<servlet-name>myServlet</servlet-name>
<servlet-class>fully.qualified.className</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myServlet</servlet-name>
<url-pattern>/path/to/the/servlet</url-pattern>
</servlet-mapping>
简而言之:servlet 映射映射 url 到servlet class。因此,当您打开 /path/to/the/servlet
时,将调用 fully.qualified.className
servlet。