使用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();
}
}
}
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();
}
}
}
相关文章推荐
- Java导出数据为EXCEL的两种方式JXL和POI
- 【JavaWeb开发】使用java实现简单的Excel文件的导入与导出(POI)
- 大数据IMF传奇行动绝密课程第83课:透彻讲解使用Scala和Java两种方式实战Spark Streaming开发
- 第83课:使用Scala和Java两种方式实战Spark Streaming开发 本地webui小技巧
- Java 使用jxl类库以流的方式实现Excel导入导出
- 控件开发时两种JS嵌入资源方式的使用方法
- 控件开发时两种JS嵌入资源方式的使用方法
- Asp.net开发经验-利用Aspose.Words按模板导出Word(注:Excel可以使用Aspose.Excel)
- java创建excel的两种方式
- 使用XML方式导出Excel(自动分页)
- java application 应用程序 使用JDBC proxool 两种方式连接数据库 测试程序代码
- java中使用JXL对Excel文件进行数据的写入、导出操作
- 使用.net和java两种方式收取Gmail邮件。
- DataGridView扩展方法行号、全选、导出到Excel(引用excel组件、生成html两种方式)
- 使用BO JAVA SDK打开WEBI报表,并进行PDF、EXCEL、CSV、HTML导出
- Java使用POI导出到Excel。
- java数据库开发中两种注册oracle驱动的方式
- datagridview 导出excel的两种方式
- pb9中使用htmltable方式将数据窗口导出为excel文件的几点看法
- java导出excel--------自己学习使用