您的位置:首页 > 其它

poi/jxls导入/导出Excel工具类(支持2003和2007)

2016-07-06 10:48 465 查看
1、ExportUtil导出工具类(根据模板导出),支持2003/2007不同excel格式文件

package org.nercita.bcp.util;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URLEncoder;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Properties;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import net.sf.jxls.transformer.XLSTransformer;

import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.core.io.ClassPathResource;
import org.springframework.util.Assert;

/**
* 导出工具类
*/
public class ExportUtil {
public static String EXCEL_2007 = "Excel2007";
public static String EXCEL_2003 = "Excel2003";
private volatile Properties props = new Properties();
private boolean inited = false;
private volatile static ExportUtil util = new ExportUtil();

private ExportUtil() {
init();
}

public Properties getProps() {
if (!inited)
init();
return props;
}

public String getProp(String key) {
if (!inited)
init();
return props.getProperty(key);
}

public String getProp(String key, String defaultValue) {
if (!inited)
init();
return props.getProperty(key, defaultValue);
}

private void init() {
try {
InputStream is = new ClassPathResource("export.properties").getInputStream();
props.load(is);
is.close();
inited = true;
} catch (IOException e) {
e.printStackTrace();
}
}

public static ExportUtil getUtil() {
if (util == null)
util = new ExportUtil();
return util;
}

/**
* 设置下载文件中文件的名称
*
* @param pFileName
* @param request
* @return
*/
public static String encodeFilename(String pFileName, HttpServletRequest request){
String filename = null;
String agent = request.getHeader("USER-AGENT");
try {

if (null != agent){
if (-1 != agent.indexOf("Firefox")) {//Firefox
filename = "=?UTF-8?B?" + (new String(org.apache.commons.codec.binary.Base64.encodeBase64(pFileName.getBytes("UTF-8"))))+ "?=";
}else if (-1 != agent.indexOf("Chrome")) {//Chrome
filename = new String(pFileName.getBytes(), "ISO8859-1");
} else {//IE7+
filename = URLEncoder.encode(pFileName, "UTF-8");
filename = StringUtils.replace(filename, "+", "%20");//替换空格
}
} else {
filename = pFileName;
}

} catch (Exception ex) {

}
return filename;
}

//导出
public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response,
String version, String templatePath, Map<String, Object> beanParams,Map<Integer,List<CellFill>> mapFill) {
writeResponse(fileName, request, response, version, templatePath, beanParams, false, null, null, mapFill);
}

public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response,
String version, String templatePath, Map<String, Object> beanParams) {
writeResponse(fileName, request, response, version, templatePath, beanParams, false, null, null, null);
}

public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response, String version, String templatePath, Map<String, Object> beanParams,
boolean innerCollectionAccess) {
writeResponse(fileName, request, response, version, templatePath, beanParams, innerCollectionAccess, null, null, null);
}

public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response, String version, String templatePath, Map<String, Object> beanParams,
boolean innerCollectionAccess, Map<Integer, List<CellRangeAddress>> rangeMap) {
writeResponse(fileName, request, response, version, templatePath, beanParams, innerCollectionAccess, rangeMap, null, null);
}

public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response, String version, String templatePath, Map<String, Object> beanParams,
Map<Integer, List<CellRangeAddress>> rangeMap, XLSTransformer transformer) {
writeResponse(fileName, request, response, version, templatePath, beanParams, false, rangeMap, transformer, null);
}

//
public static void writeResponse(String fileName, HttpServletRequest request, HttpServletResponse response,
String version, String templatePath, Map<String, Object> beanParams,
boolean innerCollectionAccess, Map<Integer, List<CellRangeAddress>> rangeMap, XLSTransformer trans,
Map<Integer,List<CellFill>> mapFill) {
Assert.isTrue(StringUtils.isNotBlank(templatePath), "templatePath不可以为空字符串");
XLSTransformer transformer = null;
if (trans != null) {
transformer = trans;
} else {
transformer = new XLSTransformer();
}
transformer.setJexlInnerCollectionsAccess(innerCollectionAccess);
response.setCharacterEncoding("utf-8");
if (EXCEL_2007.equals(version)) {
fileName = encodeFilename(fileName + ".xlsx", request);
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=UTF-8");
} else {
fileName = encodeFilename(fileName + ".xls", request);
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
}
response.setHeader("Content-Disposition", "attachment;fileName=" + fileName);
InputStream is = null;
try {
if("linux".equals(System.getProperty("os.name").toLowerCase())){
if(!templatePath.startsWith("/")){
templatePath="/"+templatePath;
}
}
is = new FileInputStream(templatePath);
Workbook book = transformer.transformXLS(is, beanParams);
if (rangeMap != null) {
Iterator<Integer> index = rangeMap.keySet().iterator();
while (index.hasNext()) {
Integer i = index.next();
Sheet sheet = book.getSheetAt(i);
Iterator<CellRangeAddress> cra = rangeMap.get(i).iterator();
while (cra.hasNext()) {
sheet.addMergedRegion(cra.next());
}
}
}

//==========填充颜色,add by psh
if(mapFill!=null) {
if (EXCEL_2003.equals(version)) {
HSSFWorkbook workbook=(HSSFWorkbook)book;
Iterator<Integer> sheetIndex = mapFill.keySet().iterator();
while (sheetIndex.hasNext()) {
Integer index = sheetIndex.next();
Sheet sheet = workbook.getSheetAt(index);
List<CellFill> list = mapFill.get(index);
CellFill cellFill= null;
for(int i=0;i<list.size();i++){
cellFill= list.get(i);
Row row = (Row)sheet.getRow(cellFill.getRow());
if(row==null){
continue;
}
Cell cell = row.getCell(cellFill.getCol());
if(cell==null){
continue;
}
HSSFCellStyle sheetStyle = workbook.createCellStyle();     //Sheet样式
sheetStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); //填充模式
sheetStyle.setFillForegroundColor(cellFill.getBgColor()); //前景色(单元格)的设定。HSSFColor.YELLOW.index——黄色
HSSFFont font=workbook.createFont();
font.setColor(cellFill.getFontColor());
sheetStyle.setFont(font);
cell.setCellStyle(sheetStyle);
}
}//end while
}else {
XSSFWorkbook workbook=(XSSFWorkbook)book;
Iterator<Integer> sheetIndex = mapFill.keySet().iterator();
while (sheetIndex.hasNext()) {
Integer index = sheetIndex.next();
Sheet sheet = workbook.getSheetAt(index);
List<CellFill> list = mapFill.get(index);
CellFill cellFill= null;
for(int i=0;i<list.size();i++){
cellFill= list.get(i);
Row row = (Row)sheet.getRow(cellFill.getRow());
if(row==null){
continue;
}
Cell cell = row.getCell(cellFill.getCol());
if(cell==null){
continue;
}
XSSFCellStyle sheetStyle = workbook.createCellStyle();     //Sheet样式
sheetStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND); //填充模式
sheetStyle.setFillForegroundColor(cellFill.getBgColor()); //前景色(单元格)的设定。HSSFColor.YELLOW.index——黄色
XSSFFont font=workbook.createFont();
font.setColor(cellFill.getFontColor());
sheetStyle.setFont(font);
cell.setCellStyle(sheetStyle);
}
}//end while
} //end 2007
}
//=====end 颜色===========

book.write(response.getOutputStream());
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(is);
}
}

public static String getProperty(String property) {
return getUtil().getProp(property);
}
}


2、ImportUtil.java工具类,支持2003和2007不同格式excel文件。

package org.nercita.bcp.util;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

/**
* excel文件导入工具类
*/
public class ImportUtil {

public static String EXCEL_2007_ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
public static String EXCEL_2003_ContentType = "application/vnd.ms-excel";

/**
* excel文件导入
* @param file
* @param ignoreRows 需要忽略掉的行数
* @return
* @throws FileNotFoundException
* @throws IOException
*/
public static String[][] importFile(MultipartFile file, int ignoreRows) throws FileNotFoundException, IOException {
List<String[]> result = new ArrayList<String[]>();
String contentType = file.getContentType();	 //内容类型
InputStream stream = file.getInputStream();  //输入流
Workbook wb=null;
//根据inputStream建立一个Excel对象
if (EXCEL_2003_ContentType.equals(contentType)){
wb =(Workbook) new HSSFWorkbook(stream);	//2003
}else if(EXCEL_2007_ContentType.equals(contentType)) {
wb =(Workbook) new XSSFWorkbook(stream);	//2007
}
int rowSize = 0;
Cell cell = null;
for (int sheetIndex = 0; sheetIndex < wb.getNumberOfSheets(); sheetIndex++) {
Sheet st = wb.getSheetAt(sheetIndex);
for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {
Row row = st.getRow(rowIndex);
if (null == row) {
continue;
}
int tempRowSize = row.getLastCellNum() + 1;
if (tempRowSize > rowSize) {
rowSize = tempRowSize;
}
String[] values = new String[rowSize];
Arrays.fill(values, "");
boolean hasValue = false;
for (short columnIndex = 0; columnIndex <= row.getLastCellNum(); columnIndex++) {
String value = "";
cell = row.getCell(columnIndex);
if (null != cell) {
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
if (null != date) {
value = new SimpleDateFormat("yyyy-MM-dd").format(date);
} else {
value = "";
}
} else {
DecimalFormat df = new DecimalFormat("0.#######");
//value = df.format(cell.getNumericCellValue());
value = String.valueOf(df.format(cell.getNumericCellValue()));
}
break;
case HSSFCell.CELL_TYPE_FORMULA:
// 公式生成的数据
if (!"".equals(cell.getStringCellValue())) {
value = cell.getStringCellValue();
} else {
value = cell.getNumericCellValue() + "";
}
break;
case HSSFCell.CELL_TYPE_BLANK:
break;
case HSSFCell.CELL_TYPE_ERROR:
value = "";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
value = (cell.getBooleanCellValue() == true ? "Y" : "N");
break;
default:
value = "";
}
}
if (columnIndex == 0 && value.trim().equals("")) {
break;
}
values[columnIndex] = rightTrim(value);
hasValue = true;
}
if (hasValue) {
result.add(values);
}
}
}
stream.close();
String[][] returnArray = new String[result.size()][rowSize];
for (int i = 0; i < returnArray.length; i++) {
returnArray[i] = (String[]) result.get(i);
}
return returnArray;
}

/**
* excel文件导入
* @param file
* @param ignoreRows 需要忽略掉的行数
* @return
* @throws FileNotFoundException
* @throws IOException
*/
public static String[][] importFile(MultipartFile file,int sheetIndex, int ignoreRows,Integer colCnt) throws FileNotFoundException, IOException {
List<String[]> result = new ArrayList<String[]>();
String contentType = file.getContentType();	 //内容类型
InputStream stream = file.getInputStream();  //输入流
Workbook wb=null;
//根据inputStream建立一个Excel对象
if (EXCEL_2003_ContentType.equals(contentType)){
wb =(Workbook) new HSSFWorkbook(stream);	//2003
}else if(EXCEL_2007_ContentType.equals(contentType)) {
wb =(Workbook) new XSSFWorkbook(stream);	//2007
}
int rowSize = 0;
Cell cell = null;

Sheet st = wb.getSheetAt(sheetIndex);
for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) {
Row row = st.getRow(rowIndex);
if (null == row) {
continue;
}
//			int tempRowSize = row.getLastCellNum() + 1;
int tempRowSize = row.getPhysicalNumberOfCells();

if(colCnt==null){
if (tempRowSize > rowSize) {
rowSize = tempRowSize;
}
colCnt=rowSize;
}
String[] values = new String[colCnt];
Arrays.fill(values, "");
boolean hasValue = false;
for (short columnIndex = 0; columnIndex < colCnt; columnIndex++) {
String value = "";
cell = row.getCell(columnIndex);
if (null != cell) {
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue();
break;
case HSSFCell.CELL_TYPE_NUMERIC:
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
if (null != date) {
value = new SimpleDateFormat("yyyy-MM-dd").format(date);
} else {
value = "";
}
} else {
DecimalFormat df = new DecimalFormat("0.#######");
//value = df.format(cell.getNumericCellValue());
value = String.valueOf(df.format(cell.getNumericCellValue()));
}
break;
case HSSFCell.CELL_TYPE_FORMULA:
// 公式生成的数据
if (!"".equals(cell.getStringCellValue())) {
value = cell.getStringCellValue();
} else {
value = cell.getNumericCellValue() + "";
}
break;
case HSSFCell.CELL_TYPE_BLANK:
break;
case HSSFCell.CELL_TYPE_ERROR:
value = "";
break;
case HSSFCell.CELL_TYPE_BOOLEAN:
value = (cell.getBooleanCellValue() == true ? "Y" : "N");
break;
default:
value = "";
}
}
if (columnIndex == 0 && value.trim().equals("")) {
break;
}
values[columnIndex] = rightTrim(value);
hasValue = true;
}
if (hasValue) {
result.add(values);
}
}

stream.close();
String[][] returnArray = new String[result.size()][colCnt];
for (int i = 0; i < returnArray.length; i++) {
returnArray[i] = (String[]) result.get(i);
}
return returnArray;
}

/**
* 去除字符串右侧空格(直接使用trim()将不能支持中间存在空格的单元格)
* @param str
* @return
*/
public static String rightTrim(String str) {
if (str == null) {
return "";
}
int length = str.length();
for (int i = length - 1; i >= 0; i--) {
if (0x20 != str.charAt(i)) {
break;
}
length--;
}
return str.substring(0, length);
}
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: