❶ 如何使用POI對Excel表進行導入和導出
導入POI的jar包
新建一個項目,在根目錄在新建一個lib文件夾,將jar包復制粘貼到lib文件夾後,右鍵將其添加到項目的build path中,最後的結果如圖所示:
2
編寫java類,新建一個實體類,比如我們要導出資料庫的有關電腦的信息,那麼就建一個Computer實體類,代碼如下:
package com.qiang.poi;
public class Computer {
private int id;
private String name;
private String description;
private double price;
private double credit;
public int getId() {
return id;
}
public Computer(int id, String name, String description, double price,
double credit) {
super();
this.id = id;
this.name = name;
this.description = description;
this.price = price;
this.credit = credit;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public double getCredit() {
return credit;
}
public void setCredit(double credit) {
this.credit = credit;
}
}
3
新建一個寫入excel的方法,如write2excel,參數可以後面邊寫邊決定(站在一個不熟悉POI的角度)
public static void write2Excel(){}
4
創建操作Excel的HSSFWorkbook對象
HSSFWorkbook excel= new HSSFWorkbook();
創建HSSFSheet對象
Excel中的一個sheet(工作表)對應著java中的一個HSSFSheet對象,利用HSSFWorkbook對象可以創建一個HSSFSheet對象
如:創建一個sheet名為computer的excel
HSSFSheet sheet = excel.createSheet("computer");
創建第一行標題信息的HSSFRow對象
我們都知道excel是表格,即由一行一行組成的,那麼這一行在java類中就是一個HSSFRow對象,我們通過HSSFSheet對象就可以創建HSSFRow對象
如:創建表格中的第一行(我們常用來做標題的行) HSSFRow firstRow = sheet.createRow(0); 注意下標從0開始
創建標題行中的HSSFCell數組
當然,excel中每一行是由若干個單元格,我們常稱為cell,它對應著java中的HSSFCell對象
如:創建5個單元格 HSSFCell cells[] = new HSSFCell[5];
//假設我們一行有五列數據
創建標題數據,並通過HSSFCell對象的setCellValue()方法對每個單元格進行賦值
既然單元格都准備好了,那最後是不是該填充數據了呀。對的,沒錯。填充數據之前,得把數據准備好吧,
數據:String[] titles = new String[]{"id","name","description","price","credit"};
插入一句話: 在這個時代,能讓機器做的,盡量不讓人來做,記住這句話。
好的,繼續。現在就通過for循環來填充第一行標題的數據
for (int i = 0; i < 5; i++) {
cells[0] = firstRow.createCell(i);
cells[0].setCellValue(titles[i]);
}
數據分析
第一行標題欄創建完畢後,就准備填充我們要寫入的數據吧,在java中,面向對象給我們帶來的好處在這里正好體現了,沒錯
把要填寫的數據封裝在對象中,即一行就是一個對象,n行就是一個對象列表嘛,好的,走起。
創建對象Computer,私有屬性id,name,description,price,credit,以及各屬性的setter和getter方法,如步驟二所示。
假設我們要寫入excel中的數據從資料庫查詢出來的,最後就生成了一個List<Computer>對象computers
數據寫入
具體數據有了,又該讓機器幫我們幹活了,向excel中寫入數據。
for (int i = 0; i < computers.size(); i++) {
HSSFRow row = sheet.createRow(i + 1);
Computer computer = computers.get(i);
HSSFCell cell = row.createCell(0);
cell.setCellValue(computer.getId());
cell = row.createCell(1);
cell.setCellValue(computer.getName());
cell = row.createCell(2);
cell.setCellValue(computer.getDescription());
cell = row.createCell(3);
cell.setCellValue(computer.getPrice());
cell = row.createCell(4);
cell.setCellValue(computer.getCredit());
}
將數據真正的寫入excel文件中
做到這里,數據都寫好了,最後就是把HSSFWorkbook對象excel寫入文件中了。
OutputStream out = null;
try {
out = new FileOutputStream(file);
excel.write(out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("數據已經寫入excel"); //溫馨提示
看看我的main方法吧
public static void main(String[] args) throws IOException {
File file = new File("test1.xls");
if(!file.exists()){
file.createNewFile();
}
List<Computer> computers = new ArrayList<Computer>();
computers.add(new Computer(1,"宏碁","筆記本電腦",3333,9.0));
computers.add(new Computer(2,"蘋果","筆記本電腦,一體機",8888,9.6));
computers.add(new Computer(3,"聯想","筆記本電腦,台式機",4444,9.3));
computers.add(new Computer(4, "華碩", "筆記本電腦,平板電腦",3555,8.6));
computers.add(new Computer(5, "註解", "以上價格均為捏造,如有雷同,純屬巧合", 1.0, 9.9));
write2excel(computers, file);
}
工程目錄及執行main方法後的test1.xls數據展示
源碼分享,computer就不貼了
package com.qiang.poi;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class ReadExcel {
public static void main(String[] args) throws IOException {
File file = new File("test1.xls");
if(!file.exists()){
file.createNewFile();
}
List<Computer> computers = new ArrayList<Computer>();
computers.add(new Computer(1,"宏碁","筆記本電腦",3333,9.0));
computers.add(new Computer(2,"蘋果","筆記本電腦,一體機",8888,9.6));
computers.add(new Computer(3,"聯想","筆記本電腦,台式機",4444,9.3));
computers.add(new Computer(4, "華碩", "筆記本電腦,平板電腦",3555,8.6));
computers.add(new Computer(5, "註解", "以上價格均為捏造,如有雷同,純屬巧合", 1.0, 9.9));
write2excel(computers, file);
}
public static void write2excel(List<Computer> computers,File file) {
HSSFWorkbook excel = new HSSFWorkbook();
HSSFSheet sheet = excel.createSheet("computer");
HSSFRow firstRow = sheet.createRow(0);
HSSFCell cells[] = new HSSFCell[5];
String[] titles = new String[] { "id", "name", "description", "price",
"credit" };
for (int i = 0; i < 5; i++) {
cells[0] = firstRow.createCell(i);
cells[0].setCellValue(titles[i]);
}
for (int i = 0; i < computers.size(); i++) {
HSSFRow row = sheet.createRow(i + 1);
Computer computer = computers.get(i);
HSSFCell cell = row.createCell(0);
cell.setCellValue(computer.getId());
cell = row.createCell(1);
cell.setCellValue(computer.getName());
cell = row.createCell(2);
cell.setCellValue(computer.getDescription());
cell = row.createCell(3);
cell.setCellValue(computer.getPrice());
cell = row.createCell(4);
cell.setCellValue(computer.getCredit());
}
OutputStream out = null;
try {
out = new FileOutputStream(file);
excel.write(out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
❷ POI動態生成Excel
項目功能里要求能夠將展示的報表導出excel,因為報表的數據都是動態從list傳進來的,所以使用了POI技術來動態構建excel文件。
網路里說POI是介個樣子的
「ApachePOI是Apache軟體基金會的開放源碼函式庫,POI提供API給Java程序對MicrosoftOffice格式檔案讀和寫的功能」
簡單來說就是通過它的API可以進行創建/讀取文檔,sheet,行列單元格等操作,也可以設置文檔的各個樣式。
剛接觸這個任務的時候查了很多資料,最後主要是參考了這篇文章,程序復制粘貼就跑得通,對POI的整個理解可以得到很好地提升。
詳解JAVA POI導出EXCEL報表的操作(包括各種格式及樣式的實現)
然後參考著就實現了項目里要求的樣子啦
=======================================================
網路中的示例附上作為下次使用的備忘。
創建Excel 文檔
示例1將演示如何利用Jakarta POI API 創建Excel 文檔。
示例1程序如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java .io.FileOutputStream;
public class CreateXL {
/** Excel 文件要存放的位置,假定在D盤下*/
public static String outputFile="D:\test.xls";
public static void main(String argv[]){
try{
// 創建新的Excel 工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名為預設值
// 如要新建一名為"效益指標"的工作表,其語句為:
// HSSFSheet sheet = workbook.createSheet("效益指標");
HSSFSheet sheet = workbook.createSheet();
// 在索引0的位置創建行(最頂端的行)
HSSFRow row = sheet.createRow((short)0);
//在索引0的位置創建單元格(左上端)
HSSFCell cell = row.createCell((short) 0);
// 定義單元格為字元串類型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
// 在單元格中輸入一些內容
cell.setCellValue("增加值");
// 新建一輸出文件流
FileOutputStream fOut = new FileOutputStream(outputFile);
// 把相應的Excel 工作簿存檔
workbook.write(fOut);
fOut.flush();
// 操作結束,關閉文件
fOut.close();
System.out.println("文件生成...");
}catch(Exception e) {
System.out.println("已運行 xlCreate() : " + e );
}
}
}
讀取Excel文檔中的數據
示例2將演示如何讀取Excel文檔中的數據。假定在D盤JTest目錄下有一個文件名為test1.xls的Excel文件。
示例2程序如下:
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
import java .io.FileInputStream;
public class ReadXL {
/** Excel文件的存放位置。注意是正斜線*/
public static String fileToBeRead="D:\test1.xls";
public static void main(String argv[]){
try{
// 創建對Excel工作簿文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(fileToBeRead));
// 創建對工作表的引用。
// 本例是按名引用(讓我們假定那張表有著預設名"Sheet1")
HSSFSheet sheet = workbook.getSheet("Sheet1");
// 也可用getSheetAt(int index)按索引引用,
// 在Excel文檔中,第一張工作表的預設索引是0,
// 其語句為:HSSFSheet sheet = workbook.getSheetAt(0);
// 讀取左上端單元
HSSFRow row = sheet.getRow(0);
HSSFCell cell = row.getCell((short)0);
// 輸出單元內容,cell.getStringCellValue()就是取所在單元的值
System.out.println("左上端單元是: " + cell.getStringCellValue());
}catch(Exception e) {
System.out.println("已運行xlRead() : " + e );
}
}
}
設置單元格格式
在這里,我們將只介紹一些和格式設置有關的語句,我們假定workbook就是對一個工作簿的引用。在Java中,第一步要做的就是創建和設置 字體和單元格的格式,然後再應用這些格式:
1、創建字體,設置其為紅色、粗體:
HSSFFont font = workbook.createFont();
font.setColor(HSSFFont.COLOR_RED);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
2、創建格式
HSSFCellStyle cellStyle= workbook.createCellStyle();
cellStyle.setFont(font);
3、應用格式
HSSFCell cell = row.createCell((short) 0);
cell.setCellStyle(cellStyle);
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
cell.setCellValue("標題 ");
處理WORD文檔
import java .io.*;
import org.apache.poi.hwpf.extractor.WordExtractor;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFCell;
public class TestPoi {
public TestPoi() {
}
public static void main(String args[]) throws Exception
{
FileInputStream in = new FileInputStream ("D:\a.doc");
WordExtractor extractor = new WordExtractor();
String str = extractor.extractText(in);
//System.out.println("the result length is"+str.length());
System.out.println(str);
}
}
搜集鏈接 方便以後查閱
POI操作Excel常用方法總結
自己封裝的poi操作excel工具類
❸ 如何提高poi讀寫excel文件(同一文件)的效率
我的代碼
//導入普通客戶信息
publicStringimportExcle(){
TEmployeeemployee=(TEmployee)request.getSession().getAttribute(
"employee");
TCustomerInfoc=newTCustomerInfo();
//聲明數據流
InputStreamis=null;
if(employee!=null){
inthang=0;
intlie=0;
if(excel!=null){
try{
//解析excel2007版本文件
is=newFileInputStream(excel);
XSSFWorkbookwork=newXSSFWorkbook(is);
XSSFSheetsheet=work.getSheetAt(0);
introws=sheet.getPhysicalNumberOfRows();
//循環表的行,從第二行開始
for(inti=1;i<rows;i++){
hang=i+1;
c=newTCustomerInfo();
XSSFRowrow=sheet.getRow(i);
if(row==null){//判斷是否為空
continue;
}
//讀取該行的每一列
for(intj=0;j<row.getPhysicalNumberOfCells();j++){
XSSFCellcell=row.getCell(j);
if(cell==null){
continue;
}
if(cell.toString()==null
||"".equals(cell.toString())){
continue;
}
Stringv=Util.getXssfCellValue(cell);
switch(j){//通過列數來判斷對應插如的欄位
case0:
c.setCompanyName(v);
break;
case1:
c.setLinkName(v);
break;
case2:
c.setTell(v);
break;
case3:
c.setTelephone(v);
break;
case4:
c.setPosition(v);
break;
case5:
c.setEmail(v);
break;
case6:
c.setCompanyType(v);
break;
case7:
c.setCustomerType(v);
break;
case8:
c.setCompanyDetail(v);
break;
}
c.setCreateMan(employee.getName());
c.setCreateDate(newDate());
}
customerInfoBiz.addCustomer(c);
}
request.setAttribute("message","導入成功(=^_^=)");
}catch(Exceptione){
System.out.println("進入---解析excel2003版本文件--錯誤拋出");
try{
//解析excel2003版本文件
is=newFileInputStream(excel);
HSSFWorkbookwork=newHSSFWorkbook(is);
HSSFSheetsheet=work.getSheetAt(0);
if(sheet!=null){
introws=sheet.getPhysicalNumberOfRows();
//循環表的行,從第二行開始
for(inti=1;i<rows;i++){
hang=i+1;
c=newTCustomerInfo();
HSSFRowrow=sheet.getRow(i);
if(row==null){//判斷是否為空
continue;
}
//循環表格的列
for(shortj=0;j<row
.getPhysicalNumberOfCells();j++){
HSSFCellcell=row.getCell(j);
if(cell==null){
continue;
}
if(cell.toString()==null||"".equals(cell.toString())){
continue;
}
Stringv=Util.getHssfCellValue(cell);
switch(j){//通過列數來判斷對應插如的欄位
case0:
c.setCompanyName(v);
break;
case1:
c.setLinkName(v);
break;
case2:
c.setTell(v);
break;
case3:
c.setTelephone(v);
break;
case4:
c.setPosition(v);
break;
case5:
c.setEmail(v);
break;
case6:
c.setCompanyType(v);
break;
case7:
c.setCustomerType(v);
break;
case8:
c.setCompanyDetail(v);
break;
}
c.setCreateMan(v);
c.setCreateDate(newDate());
}
customerInfoBiz.addCustomer(c);
}
request.setAttribute("message","導入成功(=^_^=)");
}
}catch(Exceptione1){
request.setAttribute("message","第"+hang+"行,第"
+lie+"列開始導入失敗,請注意導入格式!!");
e1.printStackTrace();
}
}
}
}else{
request.setAttribute("message","登錄超時,請重新登錄!!");
}
//查詢時對象中含有值對查詢有誤
if(customer!=null){
customer=null;
}
returncustomerList();
}
❹ 如何用Apache POI操作Excel文件
首先POI是開源組織Apache出品的一個開源jar包,提供了方便或漏皮解析Excel的API,我們可以非常方便的使用它來讀取Excel。這里介紹3.5Final版本。
所需用到的jar包如下:
說到Excel,有2003和2007,格式是不一樣的,用POI解析的方法也就不一樣,Excel2003主要是使用org.apache.poi.hssf.usermodel包中的類來解析,而Excel2007就是使用org.apache.poi.xssf.usermodel來解析。
解析Excel2003源碼
說到Excel,有2003和2007,格式是不一樣的,用POI解析的方法也就不一樣,Excel2003主要是使用org.apache.poi.hssf.usermodel包中的類來解析,而Excel2007就是使用org.apache.poi.xssf.usermodel來解析。
解析Excel2003源碼
StringBuffer content = new StringBuffer();
HSSFWorkbook workbook = new HSSFWorkbook(is); // 創建對Excel工作簿文件的引用
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {
if (null != workbook.getSheetAt(numSheets)) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets); // 獲得一個sheet
for (int rowNumOfSheet = 0; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {
if (null != aSheet.getRow(rowNumOfSheet)) {
HSSFRow aRow = aSheet.getRow(rowNumOfSheet); // 獲得一搜族行
for (int cellNumOfRow = 0; cellNumOfRow <= aRow.getLastCellNum(); cellNumOfRow++) {
if (null != aRow.getCell(cellNumOfRow)) {
HSSFCell aCell = aRow.getCell(cellNumOfRow); // 獲得列值衫差
if (aCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC) {
content.append(aCell.getNumericCellValue() + "\t");
} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN) {
content.append(aCell.getBooleanCellValue() + "\t");
} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
content.append(aCell.getStringCellValue() + "\t");
} else if (aCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA){
content.append(aCell.getCellFormula() + "\t");
} else {
continue;
}
}
if(cellNumOfRow == aRow.getLastCellNum()) {
content.append("\n");
}
}
}
}
}
}
return content.toString().trim();
解析Excel2007和2003基本一樣,只是將HSSFSheet,HSSFCell等都改成XSSFSheet,XSSFCell即可。
另外要提醒大家的是Excel的樣式都是基於一個單元格的,所以用HSSFRow.getRowStyle()拿樣式會出問題的,不一定會拿到你想要的樣式。處理合並單元格是POI的一個難點,只能通過判斷當前單元格是否在合並單元格之中,如果是,那此單元格的值便是這個合並單元格的首位置單元格的值,只有通過這樣才能來處理合並單元格。
處理合並單元格的代碼:
public static boolean isMergedRegion(HSSFSheet sheet, HSSFCell cell) {
//得到一個sheet中有多少個合並單元格
int sheetmergerCount = sheet.getNumMergedRegions();
for(int i = 0; i < sheetmergerCount; i++) {
//得出具體的合並單元格
CellRangeAddress ca = sheet.getMergedRegion(i);
//得到合並單元格的起始行, 結束行, 起始列, 結束列
int firstC = ca.getFirstColumn();
int lastC = ca.getLastColumn();
int firstR = ca.getFirstRow();
int lastR = ca.getLastRow();
//判斷該單元格是否在合並單元格範圍之內, 如果是, 則返回 true
if(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {
if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {
return true;
}
}
}
return false;
}
public static String getMergedRegionValue(HSSFSheet sheet, HSSFCell cell) {
//獲得一個 sheet 中合並單元格的數量
int sheetmergerCount = sheet.getNumMergedRegions();
//便利合並單元格
for(int i = 0; i < sheetmergerCount; i++) {
//獲得合並單元格
CellRangeAddress ca = sheet.getMergedRegion(i);
//獲得合並單元格的起始行, 結束行, 起始列, 結束列
int firstC = ca.getFirstColumn();
int lastC = ca.getLastColumn();
int firstR = ca.getFirstRow();
int lastR = ca.getLastRow();
//判斷該單元格是否是在合並單元格中, 如果是, 則返回所在合並單元格的首單元格的值
if(cell.getColumnIndex() <= lastC && cell.getColumnIndex() >= firstC) {
if(cell.getRowIndex() <= lastR && cell.getRowIndex() >= firstR) {
HSSFRow fRow = sheet.getRow(firstR);
HSSFCell fCell = fRow.getCell(firstC);
//除了合並單元格首單元格的值, 其餘的用(*)來區分
if (fCell.getCellType() == HSSFCell.CELL_TYPE_NUMERIC && hasBorder(cell)) {
return String.valueOf(fCell.getNumericCellValue());
} else if (fCell.getCellType() == HSSFCell.CELL_TYPE_BOOLEAN && hasBorder(cell)) {
return String.valueOf(fCell.getBooleanCellValue());
} else if (fCell.getCellType() == HSSFCell.CELL_TYPE_STRING && hasBorder(cell)) {
return fCell.getStringCellValue();
} else if (fCell.getCellType() == HSSFCell.CELL_TYPE_FORMULA && hasBorder(cell)){
return String.valueOf(fCell.getCellFormula());
}
}
}
}
return "";
}
❺ poi往excel寫必須先把整個文件讀到內存
不一定。您可以在excel文件中使滾塵掘用大核POI庫來查找和修改已有數據,而無需兄神將整個文件載入到內存中。另外
❻ POI 寫入EXCEL時出現問題
這和資料庫沒有兄枯關系
因為setCellValue方法的參數是有double,boolean,string等,而你傳進去的是float,他會把你的float轉換成double,轉的時候有問題。
如果是把float a=4444.4443f;直接弄成變數列印,也會轎塵穗出現這種情況。
可以這閉卜樣做改成
Float a=4444.4443f;
cell.setCellValue(a.toString());
測試通過
❼ 您好我也遇到POI寫入excel但是顯示不出來問題。請問你怎麼解決的
今天在使用POI將float類型數據寫EXCEL入時候會出現寫入的數值與實際數值不符的問題;例如我將數據4444.4443寫入EXCEL中(已將數據精度設置為:df.getFormat("#,##0.0"))出現問題圖及正常圖詳見下圖。此問題在從資料庫中讀出記錄寫入EXCEL時出現,直接往EXCEL文件中寫入數據時完全正常;山搭數在資料庫讀出記錄後列印出來也是完全正常的,請高手賜教,部分代碼如下:
從資料庫讀出記錄後寫入:
import java.io.FileOutputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import jcmh.com.bean.JdbcUtils;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class TestPoi {
public static void main(String[] args) throws Exception{
try{
FileOutputStream out = new FileOutputStream("dateFormat.xls");
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
Connection conn = JdbcUtils.getConnection();
Statement stmt = conn.createStatement();
HSSFSheet sheet = hssfworkbook.createSheet("new sheet");
HSSFCellStyle cs = hssfworkbook.createCellStyle();
HSSFDataFormat df = hssfworkbook.createDataFormat();
cs.setDataFormat(df.getFormat("#,##0.0"));
ResultSet rs = stmt.executeQuery("select price from test.test"); //就逗首一條記錄為"4444.4443"
while(rs.next()){
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
System.out.println(rs.getFloat(1));
cell.setCellValue(rs.getFloat(1));
cell.setCellStyle(cs);
}
hssfworkbook.write(out);
out.close();
}catch(Exception e){}
}
}
直接寫入時枝坦代碼如下:
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class TestPoi {
public static void main(String[] args) throws Exception{
try{
FileOutputStream out = new FileOutputStream("dateFormat.xls");
HSSFWorkbook hssfworkbook = new HSSFWorkbook();
HSSFSheet sheet = hssfworkbook.createSheet("new sheet");
HSSFCellStyle cs = hssfworkbook.createCellStyle();
HSSFDataFormat df =hssfworkbook.createDataFormat();
cs.setDataFormat(df.getFormat("#,##0.0"));
HSSFRow row = sheet.createRow(0);
HSSFCell cell = row.createCell(0);
cell.setCellValue(4444.4443);
cell.setCellStyle(cs);
hssfworkbook.write(out);
out.close();
}catch(Exception e){}
}
❽ 用java的poi類讀取一個excel表格的內容後再寫入到一個新excel表格中的完整代碼
幹嘛還那麼麻煩的用poi讀數據 然後又全部寫到新文件。直接用IO流實現文件的讀寫不就得啦。
❾ 基於Apache POI的Excel表格處理
通過apache 的poi方法完成excel的讀寫,cell數據讀寫等常規操作,支持xls xlsx表格格式。
需要添加依賴的jar資源,具體如下:
xls格式的excel 表格需要通過HSSFWorkbook載入,而xlsx格式的excel表格需要XSSFWorkbook表格載入,獲取WorkBook對象實例,這個實例對象就是表格文件的對象,具體為:
上面不同後綴的文件操作方法有所區分,分為兩類,xls表格對應的HSSFWorkbook類方法,xlsx對應的XSSFWorkbook類方法,操作過程基本類似,下面以答掘HSSFWorkbook為例進行講述。( xls,xlsx只要獲取到wb後,如果沒有特別的處理操作,後續採用這兩種方法的任一種都是可以進行表格數據處理,可以不做區分 )
補充:獲取wb後,wb提供的方法有很多,包括創建表格createSheet,獲取表格名稱getSheetName等等,具體根據自己需求使用。
正常來說,每個粗舉陵Excel文件都會有多個sheet表格,比如Sheet1,Sheet2,Sheet3等等,我們通過第一步獲取的wb對象,就可以輕松的拿到Excel表格的實例對象,方法兩種,可以根據Excel表格的index序號獲取,也可以通過Excel表格的名字獲取,具體如下:
補充:sheet對象同樣提供了用於操作本表格的很多方法,包括行列讀寫,新填行列等等所有表格相關的操作內容。
上一步獲取了sheet對象,我們就可以獲取具體的行列數據了。
通過上述cell對象我們就可以獲得具體的內容了,包括內容格式等等詳細信息。
單元格讀取方式根據其類型有所不同,具體如下所示。
如果想給新添加的Cell設置個字體格式及顏色啥的,也是可以的,比如把剛新建的Cell字體設為紅色,具體如下:
上面步驟,只是對於表格數據的處理,但實際上並沒有保存到文件,如果此時就結束,那表格文件里的數據其實是沒有更改,一定要記得最後要保存到表格哦~,具體如下:岩戚
到此,基本的表格讀寫處理已經基本完成了,Poi的方法庫其實有很多操作,這里只是簡單介紹的基本的讀寫,如果你想修改表格字體等等,都是可以實現的哦,趕緊動手試試吧。
本程序Gitee源碼地址: https://gitee.com/carmanshaw/excelpoi-master.git
開發的表格處理小工具地址: https://gitee.com/carmanshaw/ExcelProcessor.git
❿ java poi 在伺服器生成excel文件
報格式錯誤是因為你沒有填充EXCEL的內容。
正確的做法是:
1, HSSFWorkbook ws = new HSSFWorkbook();//建立新HSSFWorkbook對象
2, Sheet sheet = workbook.createSheet(0); //建立一個新的sheet
3,Row row = sheet.createRow(1); //建立一個新的row對象
4, Cell cell = row.createCell(0); //在row上創建方格即列,
cell.setCellValue(cellValue); //設置這個行中列的值
cell.setCellStyle(cellStyle); //設置樣式