excel 工具类

package com.sunline.ermas.facility.utils;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.Field;
import java.net.URLEncoder;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletOutputStream;

import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Colour;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import sun.misc.BASE64Encoder;

import org.apache.commons.fileupload.FileItem;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.stereotype.Component;

import com.sunline.kylin.web.ark.client.utils.StringUtils;
import com.sunline.kylin.web.core.client.exception.FlatException;

/**
* jxl导入导出excel公共类
* @author tanww
*
*/
@Component
public class JXLExcelUtils {

public static void main(String[] args) throws FileNotFoundException {
JXLExcelUtils jxlExcelUtils = new JXLExcelUtils();
// File file = new File("C://Users//admin//Desktop//快易花-黑名单模板.xlsx");
// File file = new File("C://Users//admin//Desktop//快易花-黑名单模板123.xls");
// InputStream inputStream = new FileInputStream(file);
// List<List<String>> results = jxlExcelUtils.readExcel(inputStream, 0);
// for(List<String> rows : results){
// for(String col : rows){
// System.out.print(col+"              ");
// }
// System.out.println();
// }
}

/**
* 解析excel文件
* @param is 文件流
* @param startRow 从第几行开始获取数据
* @return
*/
@SuppressWarnings("finally")
public List<List<String>> readExcel(FileItem fileItem, int startRow) {
List<List<String>> results = new ArrayList<List<String>>();
try {
if(fileItem.getName().endsWith(".xls")){
results = this.readHSSFExcel(fileItem.getInputStream(), startRow);
}else if(fileItem.getName().endsWith(".xlsx")){
results = this.readXSSFExcel(fileItem.getInputStream(), startRow);
}else{
throw new FlatException("文件格式不正确,只能上传.xlsx或者.xls文件");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return results;
}


/**
* 解析以.xls结尾的excel文件
* @param is 文件流
* @param startRow 从第几行开始获取数据
* @return
*/
@SuppressWarnings("finally")
private  List<List<String>> readHSSFExcel(InputStream is, int startRow) {
List<List<String>> results = new ArrayList<List<String>>();
Workbook book = null;
try {
book = Workbook.getWorkbook(is);

for (int numSheet = 0; numSheet < book.getNumberOfSheets(); numSheet++) {
Sheet sheet = book.getSheet(numSheet);
if (sheet == null) {
continue;
}
int rows = sheet.getRows(); // 总行数
int columns = sheet.getColumns(); // 总列数

for (int i = startRow; i < rows; i++) {
List<String> rowData = new ArrayList<String>();
for(int j = 0; j < columns; j++){
Cell cell = sheet.getCell(j, i);
String content = "";  
CellType cellType=cell.getType();
if(CellType.DATE.equals(cellType)){
DateCell dc = (DateCell) cell;
Date date =dc.getDate();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
content=formater.format(date);
}else if(CellType.EMPTY.equals(cellType)){
content="";
}else if(CellType.NUMBER.equals(cellType)){
content=cell.getContents();
}else{
content=cell.getContents();
}
rowData.add(content);
}
if(rowData.size()>0&&!"[]".equals(rowData.toString().replaceAll(",", "").replaceAll(" ", ""))){
results.add(rowData);
}
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (book != null) {
book.close();
}

return results;
}
}


/**
* 解析xlsx结尾的excel文件
* @param is 文件流
* @param startRow 从第几行开始获取数据
* @return
*/
@SuppressWarnings("finally")
private  List<List<String>> readXSSFExcel(InputStream is, int startRow) {
List<List<String>> results = new ArrayList<List<String>>();
// 获取excel工作簿        
XSSFWorkbook book =  null;      
try {
book = new XSSFWorkbook(is);

for (int numSheet = 0; numSheet < book.getNumberOfSheets(); numSheet++) {
XSSFSheet sheet = book.getSheetAt(numSheet);
if (sheet == null) {
continue;
}
int rows = sheet.getLastRowNum(); // 总行数
// int columns = sheet.get // 总列数

for (int i = startRow; i <= rows; i++) {
List<String> rowData = new ArrayList<String>();
XSSFRow row=sheet.getRow(i);
if(row==null){
continue;
}
int columns=row.getLastCellNum();//总列数
for(int j = 0; j < columns; j++){
XSSFCell cell = row.getCell(j);                
if (cell == null) {                    
continue;                
}                
String content = "";  
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_NUMERIC :
if (HSSFDateUtil.isCellDateFormatted(cell)) {
Date date = cell.getDateCellValue();
DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
content=formater.format(date);
}else{
content = String.valueOf(cell.getNumericCellValue());
}
break;
case HSSFCell.CELL_TYPE_STRING :
content = StringUtils.isBlank(cell.getRichStringCellValue().getString())?"":cell.getRichStringCellValue().getString();
break;
case HSSFCell.CELL_TYPE_FORMULA :
content =StringUtils.isBlank(cell.getCellFormula())?"":cell.getCellFormula();
break;
default:
content=StringUtils.isBlank(cell.getStringCellValue())?"":cell.getStringCellValue();
}
rowData.add(content);

}
if(rowData.size()>0&&!"[]".equals(rowData.toString().trim())){
results.add(rowData);
}
}
}
}catch (Error e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return results;
}
}

/**
* 写入excel
* @param out
* @param objData 导出内容数组 Object
* @param sheetName 导出工作表的名称
* @param columns 导出Excel的表头数组
* @return
*/
public void writeExcel(ServletOutputStream out, List<List<Object>> objData, String sheetName, String[] columns) {
WritableWorkbook wwb;
try {
// 根据传进来的file对象创建可写入的Excel工作薄
wwb = Workbook.createWorkbook(out);
/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。 createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
WritableSheet ws = wwb.createSheet(sheetName, 0);

// 创建单元格样式
WritableCellFormat wcf = new WritableCellFormat();

// 背景颜色设置为"那什么"色
// wcf.setBackground(Colour.WHITE);

// 这个是单元格内容居中显示 还有很多很多样式
wcf.setAlignment(Alignment.LEFT);

// 判断一下表头数组是否有数据
if (columns != null && columns.length > 0) {
// 循环写入表头
for (int i = 0; i < columns.length; i++) {
/*
* 添加单元格(Cell)内容addCell() 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型 如:jxl.write.DateTime
* 、jxl.write.Number、jxl.write.Label Label(i, 0, columns[i], wcf) 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
ws.addCell(new Label(i, 0, columns[i], wcf));
ws.setColumnView(i, 15);
}

// 判断表中是否有数据
if (objData != null && objData.size() > 0) {

// 循环写入表中数据
for (int i = 0; i < objData.size(); i++) {
List<Object> obj = objData.get(i);

// 将得到的记录写入Cell(单元格)中
for (int j = 0; j < obj.size(); j++) {

// 这里不引用样式了、j为列、(i+1)为行、因为表头占去了一行、所以后面的就+1
ws.addCell(new Label(j, i + 1, String.valueOf(obj.get(j))));
}
}
}

// 写入Exel工作表
wwb.write();

// 关闭Excel工作薄对象
wwb.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

/**
* 报表数据导出excel
* @param out
* @param objData 导出数据 Map<String, Serializable>
* @param sheetName 导出工作表的名称
* @param columns 导出Excel的表头数组
* @return
*/
public void exportReportByExcel(ServletOutputStream out, List<Map<String, Object>> objData, String sheetName, String[] columns) {
WritableWorkbook wwb;
try {
// 根据传进来的file对象创建可写入的Excel工作薄
wwb = Workbook.createWorkbook(out);

/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。 createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
WritableSheet ws = wwb.createSheet(sheetName, 0);

// 创建单元格样式
WritableCellFormat wcf = new WritableCellFormat();

// 背景颜色设置为"那什么"色
wcf.setBackground(Colour.WHITE);

// 这个是单元格内容居中显示 还有很多很多样式
wcf.setAlignment(Alignment.LEFT);

// 判断一下表头数组是否有数据
if (columns != null && columns.length > 0) {
// 循环写入表头
for (int i = 0; i < columns.length; i++) {
/*
* 添加单元格(Cell)内容addCell() 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型 如:jxl.write.DateTime
* 、jxl.write.Number、jxl.write.Label Label(i, 0, columns[i], wcf) 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
ws.addCell(new Label(i, 0, columns[i], wcf));
}

// 判断表中是否有数据
if (objData != null && objData.size() > 0) {

// 循环写入表中数据
for (int i = 0; i < objData.size(); i++) {
Map<String, Object> obj = objData.get(i);
int j = 0;
// 将得到的记录写入Cell(单元格)中
for (Object s : obj.values()) {

// 这里不引用样式了、j为列、(i+1)为行、因为表头占去了一行、所以后面的就+1
ws.addCell(new Label(j++, i + 1, String.valueOf(s)));
}
}
}

// 写入Exel工作表
wwb.write();

// 关闭Excel工作薄对象
wwb.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

/**
* 报表数据导出excel
* @param out
* @param objData 导出数据 Map<String, Serializable>
* @param sheetName 导出工作表的名称
* @param columns 导出Excel的表头数组
* @return
*/
public void  writeReportByExcel(ServletOutputStream out, List<Map<String, Serializable>> objData, String sheetName, String[] columns) {
WritableWorkbook wwb;
try {
// 根据传进来的file对象创建可写入的Excel工作薄
wwb = Workbook.createWorkbook(out);

/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。 createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
WritableSheet ws = wwb.createSheet(sheetName, 0);

// 创建单元格样式
WritableCellFormat wcf = new WritableCellFormat();

// 背景颜色设置为"那什么"色
wcf.setBackground(Colour.WHITE);

// 这个是单元格内容居中显示 还有很多很多样式
wcf.setAlignment(Alignment.LEFT);

// 判断一下表头数组是否有数据
if (columns != null && columns.length > 0) {
// 循环写入表头
for (int i = 0; i < columns.length; i++) {
/*
* 添加单元格(Cell)内容addCell() 添加Label对象Label()
* 数据的类型有很多种、在这里你需要什么类型就导入什么类型 如:jxl.write.DateTime
* 、jxl.write.Number、jxl.write.Label Label(i, 0, columns[i], wcf) 其中i为列、0为行、columns[i]为数据、wcf为样式
* 合起来就是说将columns[i]添加到第一行(行、列下标都是从0开始)第i列、样式为什么"色"内容居中
*/
ws.addCell(new Label(i, 0, columns[i], wcf));
}

// 判断表中是否有数据
if (objData != null && objData.size() > 0) {

// 循环写入表中数据
for (int i = 0; i < objData.size(); i++) {
Map<String, Serializable> obj = objData.get(i);
int j = 0;
// 将得到的记录写入Cell(单元格)中
for (Serializable s : obj.values()) {

// 这里不引用样式了、j为列、(i+1)为行、因为表头占去了一行、所以后面的就+1
ws.addCell(new Label(j++, i + 1, String.valueOf(s)));
}
}
}

// 写入Exel工作表
wwb.write();

// 关闭Excel工作薄对象
wwb.close();
}
} catch (Exception ex) {
ex.printStackTrace();
}
}

/**     
* 判断属性是否为日期类型         
* @param clazz   数据类型    
* @param fieldName 属性名     
* @return 如果为日期类型返回true,否则返回false     
*/  
protected <T> boolean isDateType(Class<T> clazz, String fieldName) {   
boolean flag = false;       
try {            
Field field = clazz.getDeclaredField(fieldName);            
Object typeObj = field.getType().newInstance();            
flag = typeObj instanceof Date;        
} catch (Exception e) {            
// 把异常吞掉直接返回false        
}       
return flag;    
}      
/**     
* 根据类型将指定参数转换成对应的类型     
* @param value 指定参数    
* @param type  指定类型    
* @return 返回类型转换后的对象     
*/   
protected <T> Object parseValueWithType(String value, Class<?> type) {       
Object result = null;       
try { // 根据属性的类型将内容转换成对应的类型            
if (Boolean.TYPE == type) {                
result = Boolean.parseBoolean(value);            
} else if (Byte.TYPE == type) {
result = Byte.parseByte(value);            
} else if (Short.TYPE == type) {               
result = Short.parseShort(value);            
} else if (Integer.TYPE == type) {                
result = Integer.parseInt(value);            
} else if (Long.TYPE == type) {                
result = Long.parseLong(value);            
} else if (Float.TYPE == type) {                
result = Float.parseFloat(value);            
} else if (Double.TYPE == type) {                
result = Double.parseDouble(value);            
} else {                
result = (Object) value;            
}        
} catch (Exception e) {             // 把异常吞掉直接返回null        

}        
return result;   
}
/**
* 根据不同浏览器设置文件名编码
* @param string
* @param userAgent
* @return
*/
public String getFileNameFromBrowser(String filename, String browserAgent) {
if (browserAgent.contains("Firefox")) {
// base64
BASE64Encoder encoder = new BASE64Encoder();
try {
return "=?utf-8?B?" + encoder.encode(filename.getBytes("utf-8")) + "?=";
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
try {
return URLEncoder.encode(filename, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
throw new RuntimeException("附件名错误");
}
}
}

猜你喜欢

转载自2513312341.iteye.com/blog/2394009