📄 abstractexcelview.java
字号:
/*
* Copyright 2002-2004 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.springframework.web.servlet.view.document;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Locale;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.springframework.context.ApplicationContextException;
import org.springframework.web.servlet.support.RequestContextUtils;
import org.springframework.web.servlet.view.AbstractView;
/**
* Convenient superclass for Excel-document views.
* Properties:
* <li>url (optional): The url of an existing Excel document to pick as a starting point.
* It is done without localization part nor the .xls extension.
* <br>The file will be searched with names in the following order:
* <li>[url]_[language][country].xls
* <li>[url]_[language].xls
* <li>[url].xls
* <br>For work with th workBook in the subclass, see <a href="http://jakarta.apache.org/poi/index.html">Jakarta's POI site</a>
* <br>As an example, you can try this snippet:<br>
* <code>
* <br>protected void buildExcelDocument(
* <br> Map model,
* <br> HSSFWorkbook wb,
* <br> HttpServletRequest request,
* <br> HttpServletResponse response )
* <br>{
* <br> // AModel aModel = ( AModel ) model.get( "amodel" );
* <br>
* <br> HSSFSheet sheet;
* <br> HSSFRow sheetRow;
* <br> HSSFCell cell;
* <br>
* <br> // Go to the first sheet
* <br> // getSheetAt: only if wb is created from an existing document
* <br> //sheet = wb.getSheetAt( 0 );
* <br> sheet = wb.createSheet("Spring");
* <br> sheet.setDefaultColumnWidth((short)12);
* <br>
* <br> // write a text at A1
* <br> cell = getCell( sheet, 0, 0 );
* <br> setText(cell,"Spring POI test");
* <br>
* <br> // Write the current date at A2
* <br> HSSFCellStyle dateStyle = wb.createCellStyle( );
* <br> dateStyle.setDataFormat( HSSFDataFormat.getBuiltinFormat( "m/d/yy" ) );
* <br> cell = getCell( sheet, 1, 0 );
* <br> cell.setCellValue( new Date() );
* <br> cell.setCellStyle( dateStyle );
* <br>
* <br> // Write a number at A3
* <br> getCell( sheet, 2, 0 ).setCellValue( 458 );
* <br>
* <br> // Write a range of numbers
* <br> sheetRow = sheet.createRow( 3 );
* <br> for (short i = 0; i<10; i++) {
* <br> sheetRow.createCell(i).setCellValue( i*10 );
* <br> }
* <br>}
* <br>
* </code>
* <br>Don't forget to add on web.xml:
* <code>
* <br><servlet-mapping>
* <br> <servlet-name>[your Spring servlet]</servlet-name>
* <br> <url-pattern>*.xls</url-pattern>
* <br></servlet-mapping>
* </code>
* <br>The use of this view is close to the AbstractPdfView
* @see AbstractPdfView
* @author <a href="mailto:jp.pawlak@tiscali.fr">Jean-Pierre Pawlak</a>
*/
public abstract class AbstractExcelView extends AbstractView {
private static final String EXTENSION = ".xls";
private static final String SEPARATOR = "_";
private String url;
private HSSFWorkbook wb;
public AbstractExcelView() {
setContentType("application/vnd.ms-excel");
}
/**
* Sets the url of the Excel workbook source without localization part nor extension.
*/
public void setUrl(String url) {
this.url = url;
}
/**
* Renders the view given the specified model.
*/
protected final void renderMergedOutputModel(Map model, HttpServletRequest request,
HttpServletResponse response) throws Exception {
if (this.url != null) {
this.wb = getTemplateSource(this.url, request);
}
else {
this.wb = new HSSFWorkbook();
logger.info("Excel WorkBook created from scratch");
}
buildExcelDocument(model, this.wb, request, response);
// response.setContentLength(wb.getBytes().length);
response.setContentType(getContentType());
ServletOutputStream out = response.getOutputStream();
this.wb.write(out);
out.flush();
}
/**
* Creates the workBook from an existing .xls document.
* @param url url of the Excle template without localization part nor extension
* @param request
* @return HSSFWorkbook
*/
protected HSSFWorkbook getTemplateSource(String url, HttpServletRequest request)
throws ServletException {
String source = null;
String realPath = null;
FileInputStream inputFile = null;
Locale userLocale = RequestContextUtils.getLocale(request);
String lang = userLocale.getLanguage();
String country = userLocale.getCountry();
// Check for document with language and country localisation
if (country.length() > 1) {
source = url + SEPARATOR + lang + country + EXTENSION;
realPath = getServletContext().getRealPath(source);
try {
inputFile = new FileInputStream(realPath);
}
catch (FileNotFoundException e) {
// Nothing: at this stage, it is acceptable
}
}
// Check for document with language localisation
if (lang.length() > 1 && null == inputFile) {
source = url + SEPARATOR + lang + EXTENSION;
realPath = getServletContext().getRealPath(source);
try {
inputFile = new FileInputStream(realPath);
}
catch (FileNotFoundException e) {
// Nothing: at this stage, it is acceptable
}
}
// Check for document without localisation
if (null == inputFile) {
source = url + EXTENSION;
realPath = getServletContext().getRealPath(source);
try {
inputFile = new FileInputStream(realPath);
}
catch (FileNotFoundException e) {
throw new ApplicationContextException(
"Can't resolve real path for EXCEL template at '"
+ source
+ "'; probably results from container restriction: override ExcelView.getTemplateSource() to use an alternative approach to getRealPath()");
}
}
// Create the Excel document from source
try {
POIFSFileSystem fs = new POIFSFileSystem(inputFile);
HSSFWorkbook workBook = new HSSFWorkbook(fs);
logger.info("Loaded Excel workBook " + source);
return workBook;
}
catch (IOException e) {
throw new ApplicationContextException("IOException with '" + source + "': " + e.getMessage());
}
}
/**
* Subclasses must implement this method to create an Excel HSSFWorkbook document,
* given the model.
* @param model
* @param wb The Excel workBook to complete
* @param request in case we need locale etc. Shouldn't look at attributes
* @param response in case we need to set cookies. Shouldn't write to it.
*/
protected abstract void buildExcelDocument(Map model, HSSFWorkbook wb, HttpServletRequest request,
HttpServletResponse response) throws Exception;
/**
* Convenient method to obtain the cell in the given sheet, row and column
* <br>Creating by the way the row and the cell if they still doesn't exist
* <br>Thus, the column can be passed as an int, the method making the needed
* downcasts.
* @param sheet A sheet Object. The first sheet is usually obtained by wb.getSheetAt(0)
* @param row
* @param col
* @return HSSFCell
*/
protected HSSFCell getCell(HSSFSheet sheet, int row, int col) {
HSSFRow sheetRow = sheet.getRow(row);
if (null == sheetRow) {
sheetRow = sheet.createRow(row);
}
HSSFCell cell = sheetRow.getCell((short) col);
if (null == cell) {
cell = sheetRow.createCell((short) col);
}
return cell;
}
/**
* Convenient method to set a String as text content in a cell.
* @param cell The cell in which the text must be put
* @param text The text to put in the cell
*/
protected void setText(HSSFCell cell, String text) {
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue(text);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -