在java的程序生涯中,excel的操作用不落實,很多業務都需要報表,很多公司的其他職能部門都需要導出excel或者導入excel,這裏給大家講一下(總結一下)excel的導入,導出方法。
一、導出
excel導出主要分爲2步,先從數據庫查詢出數據,將組裝出excel,再將組裝的數據導出來。
介紹2中常用的excel使用到jar包,也是兩中工具類吧。poi(Poor Obfuscation Implementation,直譯爲“可憐的模糊實現”--有點意思)和jxl。jxl 只能操作Excel 95, 97, 2000也即以.xls爲後綴的excel。而poi可以操作Excel 95及以後的版本,即可操作後綴爲 .xls 和 .xlsx兩種格式的excel
poi的jar:
poi-ooxml-3.15.jar
poi-ooxml-schemas-3.15.jar
xmlbeans-2.6.0.jar
dom4j.jar(看情況)
jxl的jar:
jxl.jar
1、jxl
JXL 用起來挺簡單的,不過相應的其功能也並不是十分強大,對於一般的簡單的excel操作還可以,對於太複雜的還是有些吃力,基本的操作也就是以下幾項內容。
首先,要創建一個可讀寫的工作簿(WritableWorkbook):
WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\test.xls"));
如果是想要修改一個已存在的excel工作簿,則需要先獲得它的原始工作簿,再創建一個可讀寫的副本:
Workbook wb = Workbook.getWorkbook(new File("src\\test\\test.xls")); // 獲得原始文檔
WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\test_modified.xls"),wb); // 創建一個可讀寫的副本
然後,取得我們要操作的sheet,並對其進行相應的操作,如改名、合併單元格、設置列寬、行高等:
WritableSheet sheet = workbook.getSheet(0);
sheet.setName("修改後"); // 給sheet頁改名
workbook.removeSheet(2); // 移除多餘的標籤頁
workbook.removeSheet(3);
sheet.mergeCells(0, 0, 4, 0); // 合併單元格
sheet.setRowView(0, 600); // 設置行的高度
sheet.setColumnView(0, 30); // 設置列的寬度
sheet.setColumnView(1, 20); // 設置列的寬度
之後,就是對單元格的操作了,可以通過如下方法獲取一個單元格,其中兩個參數分別爲列、行的位置,從0開始計數,如(2,3)就代表單元格C4:
WritableCell cell = sheet.getWritableCell(2,3);
通過WritableFont、WritableCellFormat等對象可以設置單元格的字體、樣式等外觀:
WritableFont titleWf = new WritableFont(WritableFont.createFont("仿宋_GB2312"),// 字體
20,//WritableFont.DEFAULT_POINT_SIZE, // 字號
WritableFont.NO_BOLD, // 粗體
false, // 斜體
UnderlineStyle.NO_UNDERLINE, // 下劃線
Colour.BLUE2, // 字體顏色
ScriptStyle.NORMAL_SCRIPT);
WritableCellFormat wcf = new WritableCellFormat(titleWf);
wcf.setBackground(Colour.GRAY_25);// 設置單元格的背景顏色
wcf.setAlignment(Alignment.CENTRE); // 設置對齊方式
wcf.setBorder(Border.ALL, BorderLineStyle.THICK); // 添加邊框
cell.setCellFormat(wcf);
在jxl中,有幾種常用的數據類型,根據單元格內數據類型的不同,每個WritableCell可以根據其類型被轉換爲它的一個子類型,以便對不同類型的數據進行專門的處理,通常可以做這樣的轉換:
WritableCell fromCell = sheet0.getWritableCell(j, i);
if (fromCell instanceof jxl.write.Number) {
jxl.write.Number num = (jxl.write.Number) fromCell;
} else if (fromCell instanceof jxl.write.Boolean) {
jxl.write.Boolean bool = (jxl.write.Boolean) fromCell;
} else if (fromCell instanceof jxl.write.DateTime) {
jxl.write.DateTime dt = (jxl.write.DateTime) fromCell;
} else if(fromCell instanceof Label){
Label _label = (Label) fromCell;
}
當然,操作完成之後一定不要忘了刷新(或者叫寫入?)和關掉工作簿:
workbook.write();
workbook.close();
下面是參考jxl api裏那個例子寫的,把我自己覺得常用的excel操作基本都包含了:
package test;
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import jxl.CellType;
import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.ScriptStyle;
import jxl.format.UnderlineStyle;
import jxl.format.VerticalAlignment;
import jxl.read.biff.BiffException;
import jxl.write.Blank;
import jxl.write.DateFormat;
import jxl.write.DateFormats;
import jxl.write.DateTime;
import jxl.write.Formula;
import jxl.write.Label;
import jxl.write.Number;
import jxl.write.NumberFormat;
import jxl.write.WritableCell;
import jxl.write.WritableCellFeatures;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableHyperlink;
import jxl.write.WritableImage;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
/**
*
* @author why
*
*/
public class ExcelTest {
/**
* @param args
* @throws IOException
* @throws BiffException
* @throws WriteException
*/
public static void main(String[] args) throws IOException, BiffException, WriteException {
Workbook wb = Workbook.getWorkbook(new File("src\\test\\test.xls")); // 獲得原始文檔
WritableWorkbook workbook = Workbook.createWorkbook(new File("d:\\test_modified.xls"),wb); // 創建一個可讀寫的副本
/**
* 定義與設置Sheet
*/
WritableSheet sheet = workbook.getSheet(0);
sheet.setName("修改後"); // 給sheet頁改名
workbook.removeSheet(2); // 移除多餘的標籤頁
workbook.removeSheet(3);
sheet.mergeCells(0, 0, 4, 0); // 合併單元格
sheet.setRowView(0, 600); // 設置行的高度
sheet.setColumnView(0, 30); // 設置列的寬度
sheet.setColumnView(1, 20); // 設置列的寬度
WritableCell cell = null;
WritableCellFormat wcf = null;
Label label = null;
WritableCellFeatures wcfeatures = null;
// 更改標題字體
cell = sheet.getWritableCell(0,0);
WritableFont titleWf = new WritableFont(WritableFont.createFont("仿宋_GB2312"),// 字體
20,//WritableFont.DEFAULT_POINT_SIZE, // 字號
WritableFont.NO_BOLD, // 粗體
false, // 斜體
UnderlineStyle.NO_UNDERLINE, // 下劃線
Colour.BLUE2, // 字體顏色
ScriptStyle.NORMAL_SCRIPT);
wcf = new WritableCellFormat(titleWf);
wcf.setBackground(Colour.GRAY_25);// 設置單元格的背景顏色
wcf.setAlignment(Alignment.CENTRE); // 設置對齊方式
wcf.setBorder(Border.ALL, BorderLineStyle.THICK); // 添加邊框
cell.setCellFormat(wcf);
// 將B3的字體改爲仿宋_GB2312
cell = sheet.getWritableCell(1,2);
WritableFont fs = new WritableFont(WritableFont.createFont("仿宋_GB2312"),
11);
wcf = new WritableCellFormat(fs);
cell.setCellFormat(wcf);
// 將B4的字號改爲20
cell = sheet.getWritableCell(1,3);
WritableFont size20 = new WritableFont(WritableFont.createFont("宋體"),
20);
wcf = new WritableCellFormat(size20);
cell.setCellFormat(wcf);
// 將B5的字體改爲加粗
cell = sheet.getWritableCell(1,4);
WritableFont bold = new WritableFont(WritableFont.createFont("宋體"),
11,
WritableFont.BOLD);
wcf = new WritableCellFormat(bold);
cell.setCellFormat(wcf);
// 將B6的字體改爲傾斜
cell = sheet.getWritableCell(1,5);
WritableFont italic = new WritableFont(WritableFont.createFont("宋體"),
11,
WritableFont.NO_BOLD,
true);
wcf = new WritableCellFormat(italic);
cell.setCellFormat(wcf);
// 將B7字體加下劃線
cell = sheet.getWritableCell(1,6);
WritableFont underline = new WritableFont(WritableFont.createFont("宋體"),
11,
WritableFont.NO_BOLD,
false,
UnderlineStyle.SINGLE);
wcf = new WritableCellFormat(underline);
cell.setCellFormat(wcf);
// 將B8的文字改爲“待修改文字-已修改”
cell = sheet.getWritableCell(1,7);
if (cell.getType() == CellType.LABEL)
{
Label lc = (Label) cell;
lc.setString(lc.getString() + " - 已修改");
}
// 將B9文字對齊方式改爲垂直居中、右對齊
cell = sheet.getWritableCell(1,8);
WritableFont align = new WritableFont(WritableFont.createFont("宋體"),
11);
wcf = new WritableCellFormat(align);
wcf.setAlignment(Alignment.RIGHT); // 設置爲右對齊
wcf.setVerticalAlignment(VerticalAlignment.CENTRE); // 設置爲垂直居中
cell.setCellFormat(wcf);
// 將E3文字改爲自動換行
cell = sheet.getWritableCell(4,2);
WritableFont justify = new WritableFont(WritableFont.createFont("宋體"),
11);
wcf = new WritableCellFormat(justify);
wcf.setAlignment(Alignment.JUSTIFY);
cell.setCellFormat(wcf);
// 將B12的數字有效位數從5位改爲7位
cell = sheet.getWritableCell(1,11);
NumberFormat sevendps = new NumberFormat("#.0000000");
wcf = new WritableCellFormat(sevendps);
cell.setCellFormat(wcf);
// 將B13改爲4位科學計數法表示
cell = sheet.getWritableCell(1,12);
NumberFormat exp4 = new NumberFormat("0.####E0");
wcf = new WritableCellFormat(exp4);
cell.setCellFormat(wcf);
// 將B14改爲默認數字表示
cell = sheet.getWritableCell(1,13);
cell.setCellFormat(WritableWorkbook.NORMAL_STYLE);
// 將B15數字類型的值17改爲22
cell = sheet.getWritableCell(1,14);
if (cell.getType() == CellType.NUMBER)
{
Number n = (Number) cell;
n.setValue(42);
}
// 將B16的值2.71進行加法運算2.71 + 0.1
cell = sheet.getWritableCell(1,15);
if (cell.getType() == CellType.NUMBER)
{
Number n = (Number) cell;
n.setValue(n.getValue() + 0.1);
}
// 將B19日期格式改爲默認
cell = sheet.getWritableCell(1,18);
wcf = new WritableCellFormat(DateFormats.FORMAT9);
cell.setCellFormat(wcf);
// 將B20日期格式改爲dd MMM yyyy HH:mm:ss
cell = sheet.getWritableCell(1,19);
DateFormat df = new DateFormat("dd MMM yyyy HH:mm:ss");
wcf = new WritableCellFormat(df);
cell.setCellFormat(wcf);
// 將B21的日期設置爲 2011-6-1 11:18:50
cell = sheet.getWritableCell(1,20);
if (cell.getType() == CellType.DATE)
{
DateTime dt = (DateTime) cell;
Calendar cal = Calendar.getInstance();
cal.set(2011, 5, 1, 11, 18, 50);
Date d = cal.getTime();
dt.setDate(d);
}
// 將B24文字添加鏈接http://www.baidu.com
WritableHyperlink link = new WritableHyperlink(1, 23, new URL("http://www.baidu.com"));
sheet.addHyperlink(link);
// 更改URL鏈接
WritableHyperlink hyperlinks[] = sheet.getWritableHyperlinks();
for (int i = 0; i < hyperlinks.length; i++) {
WritableHyperlink wh = hyperlinks[i];
if (wh.getColumn() == 1 && wh.getRow() == 24) {
// 將B25文字鏈接取消
sheet.removeHyperlink(wh,true);//true:保留文字;false:刪除文字
}else if(wh.getColumn() == 1 && wh.getRow() == 25){
try {
// 將B26鏈接更改爲http://wuhongyu.javaeye.com
wh.setURL(new URL("http://wuhongyu.javaeye.com"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
}
// 利用公式取得B29、B30的值
Formula f1 = new Formula(1, 28, "SUM(C29:D29)");
sheet.addCell(f1);
Formula f2 = new Formula(1, 29, "AVERAGE(C30:G30)");
sheet.addCell(f2);
// 在B32處添加圖片,圖片大小佔10行3列,只支持png格式
File file = new File("d:\\shu05.png");
WritableImage image = new WritableImage(1, 31, 3, 10, file);
sheet.addImage(image);
// 在A44出添加內容"Added drop down validation",併爲其添加註釋
label = new Label(0, 43, "Added drop down validation");
wcfeatures = new WritableCellFeatures();
wcfeatures.setComment("右邊列是個下拉列表");
label.setCellFeatures(wcfeatures);
sheet.addCell(label);
// 在B44處添加一個下拉列表並添加註釋
Blank b = new Blank(1, 43);
wcfeatures = new WritableCellFeatures();
ArrayList al = new ArrayList();
al.add("why");
al.add("landor");
al.add("tjm");
wcfeatures.setDataValidationList(al);
wcfeatures.setComment("這是一個註釋");
b.setCellFeatures(wcfeatures);
sheet.addCell(b);
// 爲A46添加註釋。
// 此處比較麻煩,試了多次發現必須將cell強制類型轉換、添加CellFeatures再修改註釋纔可用,不知有沒有更好的辦法。
cell = sheet.getWritableCell(0,45);
wcfeatures = new WritableCellFeatures();
wcfeatures.setComment("這個註釋不會被顯示,刪了這行還不行,MD");
cell.setCellFeatures(wcfeatures);
label = (Label) cell;
// label.setCellFeatures(wcfeatures);// 直接這樣寫會報一個警告(“註釋已存在”),但那個註釋仍會被顯示。
label.addCellFeatures();
label.getWritableCellFeatures().setComment("終於加上註釋了,哈哈哈哈");
// if (cell instanceof Number) {
// Number num = (Number) cell;
// num.setCellFeatures(wcfeatures);
// } else if (cell instanceof jxl.write.Boolean) {
// jxl.write.Boolean bool = (jxl.write.Boolean) cell;
// bool.setCellFeatures(wcfeatures);
// } else if (cell instanceof jxl.write.DateTime) {
// jxl.write.DateTime dt = (jxl.write.DateTime) cell;
// dt.setCellFeatures(wcfeatures);
// } else {
// Label _label = (Label) cell;
// _label.setCellFeatures(wcfeatures);
// }
workbook.write();
workbook.close();
wb.close();
}
}
2、poi
非常詳細
https://www.cnblogs.com/zhuixun/p/6600331.html
http://blog.csdn.net/u013068377/article/details/51659200