您的位置:首页 > 编程语言 > Java开发

使用java开发导出excel的两种方式

2016-10-28 11:51 369 查看
import java.io.OutputStream;

import java.text.SimpleDateFormat;

import java.util.Date;

import java.util.List;

import java.util.Map;

import javax.servlet.http.HttpServletResponse;

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.xssf.streaming.SXSSFSheet;

import org.apache.poi.xssf.streaming.SXSSFWorkbook;

import jxl.CellView;

import jxl.Workbook;

import jxl.format.Alignment;

import jxl.format.Colour;

import jxl.format.UnderlineStyle;

import jxl.format.VerticalAlignment;

import jxl.write.DateFormat;

import jxl.write.DateTime;

import jxl.write.Label;

import jxl.write.Number;

import jxl.write.NumberFormat;

import jxl.write.WritableCellFormat;

import jxl.write.WritableFont;

import jxl.write.WritableSheet;

import jxl.write.WritableWorkbook;

public class ExcelUtils {
/**
* 生成以xls为后缀格式的Excel,可以用excel2000以上的版本打开
* 可生成多个工作表,每个工作表最多60000行
* @param response
* @param fileName
* @param nameArray
* @param keyArray
* @param rtnList
* @throws Exception
*/
public static void exportExcel2000(HttpServletResponse response, String fileName,
String[] nameArray, String[] keyArray,
List<Map<String, Object>> rtnList) throws Exception {
OutputStream os = response.getOutputStream();

response.setHeader("Content-disposition", "attachment; filename="
+ new String(fileName.getBytes("GB2312"), "8859_1") + ".xls");
response.setContentType("application/msexcel");

WritableWorkbook wwb = Workbook.createWorkbook(os);//创建
//一些格式的设置
WritableFont wf = new WritableFont(WritableFont.ARIAL, 10,
WritableFont.BOLD, false, UnderlineStyle.NO_UNDERLINE,
Colour.BLACK);
WritableCellFormat wcf = new WritableCellFormat(wf);
wcf.setVerticalAlignment(VerticalAlignment.CENTRE);
wcf.setAlignment(Alignment.CENTRE);
wcf = new WritableCellFormat();
wcf.setAlignment(Alignment.CENTRE);

DateFormat df = new DateFormat("yyyy/MM/dd");
NumberFormat nf = new NumberFormat("0.00");
NumberFormat intnf = new NumberFormat("0");

WritableCellFormat dateWcf = new WritableCellFormat(df);
WritableCellFormat doubleWcf = new WritableCellFormat(nf);
WritableCellFormat intWcf = new WritableCellFormat(intnf);

dateWcf.setAlignment(Alignment.CENTRE);
doubleWcf.setAlignment(Alignment.CENTRE);
intWcf.setAlignment(Alignment.CENTRE);

int listSize = rtnList.size();
int sheet_num = listSize/60000+1;// 总工作表
int list_num =0;//数据list的取值下标

for(int n=0;n<sheet_num;n++){
//WritableSheet ws = wwb.createSheet(fileName, 10);
WritableSheet ws = wwb.createSheet(fileName+"sheet"+String.valueOf(n), n);//创建工作表

int num = nameArray.length;
ws.setColumnView(0, 8);
for (int i = 0; i < num; i++) {
ws.setColumnView(i, 16);
}
for(int row_num=0;row_num<60000;row_num++){
if(row_num==0){
for (int j = 0; j < num; j++) {
ws.addCell(new Label(j, 0, nameArray[j], wcf));//设置表头
}
}else{
if(list_num<listSize){//判断是否取完数据
Map<String,Object> map = rtnList.get(list_num);
list_num++;
for (int j = 0; j < keyArray.length; j++) {
String key = keyArray[j];
if (("kprq".equals(key)) || ("rzsj".equals(key))) {
String dstr = (String) map.get(keyArray[j]);
if ((dstr != null) && (!dstr.equals(""))) {
String pat = dstr.contains("/") ? "yyyy/MM/dd"
: "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(pat);
Date s_date = sdf.parse(dstr);
ws.addCell(new DateTime(j, row_num , s_date, dateWcf));
}
} else if (("je".equals(key)) || ("se".equals(key))) {
String dstr = (String) map.get(keyArray[j]);
double d = Double.parseDouble(dstr);
ws.addCell(new Number(j, row_num, d, doubleWcf));
} else if ("sl".equals(key)) {
String dstr = (String) map.get(keyArray[j]);
// int d = Integer.parseInt(dstr);
double d = Double.parseDouble(dstr);
ws.addCell(new Number(j, row_num, d, doubleWcf));
} else {
ws.addCell(new Label(j, row_num,
map.get(keyArray[j]) != null ? map.get(keyArray[j])
.toString() : "", wcf));
}
}
}else{
break;//跳出本次工作表的循环
}
}
}
}

CellView cellView = new CellView();
cellView.setAutosize(true);

wwb.write();
wwb.close();

os.flush();
os.close();
}

/**
* 根据resultList生成Excel,但是只是生成xlsx为后缀格式的Excel,只能Excel 2007以上的版本可以打开
* 可生成多个工作表,每个工作表最多60000行数据,可以将缓存中的数据先存放到硬盘里再清理缓存
* @param response
* @param fileName
* @param nameArray
* @param keyArray
* @param rtnList
* @throws Exception
*/
public static void exportExcel2007(HttpServletResponse response, String fileName,
String[] nameArray, String[] keyArray,
List<Map<String, Object>> rtnList) throws Exception {
OutputStream os = response.getOutputStream();
response.setHeader("Content-disposition", "attachment; filename="
+ new String(fileName.getBytes("GB2312"), "8859_1") + ".xlsx");
response.setContentType("application/msexcel");
try {

int rowaccess = 100;// 内存中缓存记录行数
/* keep 100 rowsin memory,exceeding rows will be flushed to disk */
SXSSFWorkbook wb = new SXSSFWorkbook(rowaccess);
int listSize = rtnList.size();
int sheet_num = listSize/60000+1;// 总工作表
int cellTotal = nameArray.length;//总列数
int list_num =0;//数据list的取值下标

for (int i = 0; i < sheet_num; i++) {
Sheet sh = wb.createSheet(fileName+"sheet"+String.valueOf(i));
// 每个SHEET有60000ROW
for (int rownum = 0; rownum < 60000; rownum++) {
Row row = sh.createRow(rownum);
// 每行有cellTotal个CELL
if(rownum == 0){
for (int cellnum = 0; cellnum < cellTotal; cellnum++) {
Cell cell = row.createCell(cellnum);
cell.setCellValue(nameArray[cellnum]);
}
}else{
if(list_num <listSize){//判断是否已取完数据
Map<String,Object> map = rtnList.get(list_num);
list_num++;
for (int cellnum = 0; cellnum < cellTotal; cellnum++) {
Cell cell = row.createCell(cellnum);
String key = keyArray[cellnum];
if("kprq".equals(key)){
String dstr = (String) map.get(key);
if ((dstr != null) && (!dstr.equals(""))) {
String pat = dstr.contains("/") ? "yyyy/MM/dd"
: "yyyy-MM-dd";
SimpleDateFormat sdf = new SimpleDateFormat(pat);
Date s_date = sdf.parse(dstr);
cell.setCellValue(s_date);
}
} else if (("je".equals(key)) || ("se".equals(key) || "sl".equals(key) )) {
String dstr = (String) map.get(key);
double d = Double.parseDouble(dstr);
cell.setCellValue(d);
}  else {
cell.setCellValue(map.get(key) != null ? map.get(key).toString() : "");
}
}
}else{
break;
}
}

// 每当行数达到设置的值就刷新数据到硬盘,以清理内存
if (rownum % rowaccess == 0) {
((SXSSFSheet) sh).flushRows();
}
}
}

wb.write(os);
os.close();

} catch (Exception e) {
e.printStackTrace();
}
}

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