java导出excel

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import jxl.Cell;
import jxl.CellType;
import jxl.DateCell;
import jxl.Sheet;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.write.Label;
import jxl.write.NumberFormats;
import jxl.write.WritableCellFormat;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;


import org.apache.commons.lang.StringUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
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.Service;


/**
 * 导入导出excel公共类
 * 
 */
@Service
public class JXLExcelFacility {
private static final String NUM_REGEX = "^[-,+]?(([1-9]([0-9]{0,14})?)|[0])([.]\\d{0,10})?$";


/**
* 解析以.xls结尾的excel文件
* @param is 文件流
* @param startRow 从第几行开始获取数据
* @return
*/
@SuppressWarnings("finally")
public  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")
public  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(FileOutputStream 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);


WritableCellFormat wcf2 = new WritableCellFormat(NumberFormats.DEFAULT);// 数字格式


// 判断一下表头数组是否有数据
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++) {
String cellVal = String.valueOf(obj.get(j));
if (cellVal.matches(NUM_REGEX)) {
ws.addCell(new jxl.write.Number(j, i + 1, Double.valueOf(cellVal), wcf2));
} else {
// 这里不引用样式了、j为列、(i+1)为行、因为表头占去了一行、所以后面的就+1
ws.addCell(new Label(j, i + 1, cellVal));
}
}
}
}


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


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

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

WritableCellFormat wcf2 = new WritableCellFormat(NumberFormats.DEFAULT);// 数字格式


// 判断表中是否有数据
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++) {
String cellVal = String.valueOf(obj.get(j));
if (cellVal.matches(NUM_REGEX)) {
ws.addCell(new jxl.write.Number(j, i + rowsCount, Double.valueOf(cellVal), wcf2));
} else {
// 这里不引用样式了、j为列、(i+rowsCount)为行、因为表头占去了rowsCount行、所以后面的就+rowsCount
ws.addCell(new Label(j, i + rowsCount, cellVal));
}
}
}
}


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


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

    
/**
* 写入 xlsx结尾的excel文件
* @param out
* @param objData 导出内容数组 Object
* @param sheetName 导出工作表的名称
* @param columns 导出Excel的表头数组
* @return
*/
public void writeXSSFExcel(FileOutputStream out, List<List<Object>> objData, String sheetName, String[] columns) {
SXSSFWorkbook book = null;
try {
// 根据传进来的file对象创建可写入的Excel工作薄
book = new SXSSFWorkbook(SXSSFWorkbook.DEFAULT_WINDOW_SIZE);
org.apache.poi.ss.usermodel.Sheet sheet = book.createSheet(sheetName);
/*
* 创建一个工作表、sheetName为工作表的名称、"0"为第一个工作表
* 打开Excel的时候会看到左下角默认有3个sheet、"sheet1、sheet2、sheet3"这样
* 代码中的"0"就是sheet1、其它的一一对应。 createSheet(sheetName, 0)一个是工作表的名称,另一个是工作表在工作薄中的位置
*/
Row row = sheet.createRow(0);


// row.setHeight((short) 350);

// 判断一下表头数组是否有数据
if (columns != null && columns.length > 0) {
// 循环写入表头
for (int i = 0; i < columns.length; i++) {
sheet.setColumnWidth(i, 10*256);
row.createCell(i).setCellValue( columns[i]);
}


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

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

row = sheet.createRow(i+1);

List<Object> obj = objData.get(i);
// 将得到的记录写入Cell(单元格)中
for (int j = 0; j < obj.size(); j++) {
org.apache.poi.ss.usermodel.Cell cell = row.createCell(j);
String cellVal = String.valueOf(obj.get(j));
if (cellVal.matches(NUM_REGEX)) {
cell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(Double.valueOf(cellVal));
} else {
cell.setCellValue(cellVal);
}
}

}
}


//写入excel
book.write(out);


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

/**
* 追加写入 xlsx结尾的excel文件
* @param file
* @param objData
*/
public void addWriteXSSFExcel(File file, List<List<Object>> objData) {
SXSSFWorkbook book = null;
InputStream is = null;
OutputStream out = null;
try {
is = new FileInputStream(file);
XSSFWorkbook xssw = new XSSFWorkbook(is);
int originalDataSize = xssw.getSheetAt(0).getLastRowNum();//只能在这里获取到行数,经过SXSSFWorkbook包装后获取不到
book = new SXSSFWorkbook(xssw, SXSSFWorkbook.DEFAULT_WINDOW_SIZE);
// 根据传进来的file对象创建可写入的Excel工作薄
org.apache.poi.ss.usermodel.Sheet sheet = book.getSheetAt(0);

Row row = null;

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

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

row = sheet.createRow(originalDataSize+i+1);

List<Object> obj = objData.get(i);
// 将得到的记录写入Cell(单元格)中
for (int j = 0; j < obj.size(); j++) {
org.apache.poi.ss.usermodel.Cell cell = row.createCell(j);
String cellVal = String.valueOf(obj.get(j));
if (cellVal.matches(NUM_REGEX)) {
cell.setCellType(org.apache.poi.ss.usermodel.Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(Double.valueOf(cellVal));
} else {
cell.setCellValue(cellVal);
}
}

}
}
//写入excel
out = new FileOutputStream(file);
book.write(out);
// 关闭Excel工作薄对象
book.dispose();
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (is != null) {
try {
is.close();
} catch (IOException e) {
}
}
if (out != null) {
try {
out.close();
} catch (IOException e) {
}
}
}
}

/**      
* 判断属性是否为日期类型          
* @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;    
}

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值