poi 操作excel 常用操作
之前寫過一篇類似的文章 這次重新寫一下 添加了一些關于樣式的代碼
package excel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Method;
import java.util.List;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPalette;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
/**
* 從excel讀取數據/往excel中寫入 excel有表頭,表頭每列的內容對應實體類的屬性
*
* @author nagsh
*
*/
public class ExcelManage {
private HSSFWorkbook workbook = null;
/**
* 判斷文件是否存在.
* @param fileDir 文件路徑
* @return
*/
public boolean fileExist(String fileDir){
boolean flag = false;
File file = new File(fileDir);
flag = file.exists();
return flag;
}
/**
* 判斷文件的sheet是否存在.
* @param fileDir 文件路徑
* @param sheetName 表格索引名
* @return
*/
public boolean sheetExist(String fileDir,String sheetName){
boolean flag = false;
File file = new File(fileDir);
if(file.exists()){ //文件存在
//創建workbook
try {
workbook = new HSSFWorkbook(new FileInputStream(file));
//添加Worksheet(不添加sheet時生成的xls文件打開時會報錯)
HSSFSheet sheet = workbook.getSheet(sheetName);
if(sheet!=null)
flag = true;
} catch (Exception e) {
e.printStackTrace();
}
}else{ //文件不存在
flag = false;
}
return flag;
}
/**
* 創建新excel.
* @param fileDir excel的路徑
* @param sheetName 要創建的表格索引
* @param titleRow excel的第一行即表格頭
*/
public void createExcel(String fileDir,String sheetName,String titleRow[]){
//創建workbook
workbook = new HSSFWorkbook();
//添加Worksheet(不添加sheet時生成的xls文件打開時會報錯)
Sheet sheet1 = workbook.createSheet(sheetName);
//新建文件
FileOutputStream out = null;
try {
//添加表頭
Row row = workbook.getSheet(sheetName).createRow(0); //創建第一行
for(int i = 0;i < titleRow.length;i++){
Cell cell = row.createCell(i);
cell.setCellValue(titleRow[i]);
}
out = new FileOutputStream(fileDir);
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 刪除文件.
* @param fileDir 文件路徑
*/
public boolean deleteExcel(String fileDir){
boolean flag = false;
File file = new File(fileDir);
// 判斷目錄或文件是否存在
if (!file.exists()) { // 不存在返回 false
return flag;
} else {
// 判斷是否為文件
if (file.isFile()) { // 為文件時調用刪除文件方法
file.delete();
flag = true;
}
}
return flag;
}
/**
* 合并單元格
* @param workbook
* @param fileDir
* @param sheetName
* @param rowStart 合并單元格開始行行號 從1開始數
* @param rowEnd 合并單元格結束行行號 從1開始數
* @param ColumnStart 合并單元格開始列列號 從1數
* @param ColumnEnd 合并單元格結束列列號 從1數
*/
public void mergedCell(HSSFWorkbook workbook,String fileDir,String sheetName,int rowStart,int rowEnd,int ColumnStart,int ColumnEnd){
try {
FileOutputStream out = null;
HSSFSheet sheet = workbook.getSheet(sheetName);
sheet.addMergedRegion(new CellRangeAddress((short)rowStart-1,(short)rowEnd-1,(short)ColumnStart-1,(short)ColumnEnd-1));
out = new FileOutputStream(fileDir);
workbook.write(out);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
/**
* 刪除行【徹底刪除】
* @param workbook
* @param fileDir
* @param sheetName
* @param rowNum 行號
*/
public void removeRow(HSSFWorkbook workbook,String fileDir,String sheetName,int rowNum){
try {
//流
FileOutputStream out = null;
HSSFSheet sheet = workbook.getSheet(sheetName);
int rowCount = sheet.getLastRowNum();
sheet.shiftRows(rowNum, rowCount, -1); //上移
out = new FileOutputStream(fileDir);
workbook.write(out);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
/**
* 刪除行【刪除數據】
* @param workbook
* @param fileDir
* @param sheetName
* @param rowNum 行號
*/
public void removeRowData(HSSFWorkbook workbook,String fileDir,String sheetName,int rowNum){
try {
//流
FileOutputStream out = null;
HSSFSheet sheet = workbook.getSheet(sheetName);
Row row = sheet.getRow(rowNum-1);
sheet.removeRow(row);
out = new FileOutputStream(fileDir);
workbook.write(out);
} catch (FileNotFoundException e) {
e.printStackTrace();
}catch (IOException e) {
e.printStackTrace();
}
}
/**
* 往excel中寫入
* @param fileDir 文件路徑
* @param sheetName 表格索引
* @param object
*/
public void writeToExcel(String fileDir,String sheetName, Object object){
//創建workbook
File file = new File(fileDir);
try {
workbook = new HSSFWorkbook(new FileInputStream(file));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
//流
FileOutputStream out = null;
HSSFSheet sheet = workbook.getSheet(sheetName);
// 獲取表格的總行數
int rowCount = sheet.getLastRowNum() + 1; // 需要加一
// 獲取表頭的列數
int columnCount = sheet.getRow(0).getLastCellNum();
try {
Row row = sheet.createRow(rowCount); //最新要添加的一行
//通過反射獲得object的字段,對應表頭插入
// 獲取該對象的class對象
Class class_ = object.getClass();
// 獲得表頭行對象
HSSFRow titleRow = sheet.getRow(0);
if(titleRow!=null){
for (int columnIndex = 0; columnIndex < columnCount; columnIndex++) { //遍歷表頭
String title = titleRow.getCell(columnIndex).toString().trim().toString().trim();
String UTitle = Character.toUpperCase(title.charAt(0))+ title.substring(1, title.length()); // 使其首字母大寫;
String methodName = "get"+UTitle;
Method method = class_.getDeclaredMethod(methodName); // 設置要執行的方法
String data = method.invoke(object).toString(); // 執行該get方法,即要插入的數據
Cell cell = row.createCell(columnIndex);
cell.setCellValue(data);
}
}
out = new FileOutputStream(fileDir);
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
/**
* 向某一行添加數據
* @param workbook 使用該參數是為了在傳遞樣式是保證workbook一致
* @param fileDir 文件路徑
* @param sheetName 索引
* @param rowNumber 要添加到哪行
* @param datas 添加的數據 【column,data】列號-數據
* @param style 樣式
*/
public void writeOneRow(HSSFWorkbook workbook,String fileDir,String sheetName,int rowNumber,List<PoiCell> datas){
try {
//流
FileOutputStream out = null;
HSSFSheet sheet = workbook.getSheet(sheetName);
sheet.autoSizeColumn(1,true); //設置自適應寬度
//最新要添加的一行
Row row = sheet.getRow(rowNumber-1);
if(row==null){
row = sheet.createRow(rowNumber-1);
}
//寫入數據
for(PoiCell data:datas){
Cell cell = row.createCell(data.getColumn()-1);
//設置樣式
cell.setCellStyle(data.getStyle());
//設置數據
cell.setCellValue(data.getData());
}
out = new FileOutputStream(fileDir);
workbook.write(out);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 將16進制的顏色代碼寫入樣式中來設置顏色
* @param style 保證style統一
* @param color 顏色:66FFDD
* @param index 索引 1-48 使用時不可重復
* @return
*/
public CellStyle getColorStyle(CellStyle style,String color,short index){
if(color!=""&&color!=null){
//轉為RGB碼
int r = Integer.parseInt((color.substring(0,2)),16); //轉為16進制
int g = Integer.parseInt((color.substring(2,4)),16);
int b = Integer.parseInt((color.substring(4,6)),16);
//自定義cell顏色
HSSFPalette palette = workbook.getCustomPalette();
palette.setColorAtIndex((short)index, (byte) r, (byte) g, (byte) b);
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setFillForegroundColor(index);
}
return style;
}
/**
* 設置邊框
* @param style
* @return
*/
public CellStyle setBorder(CellStyle style){
style.setBorderBottom(CellStyle.BORDER_THIN); //下邊框
style.setBorderLeft(CellStyle.BORDER_THIN);//左邊框
style.setBorderTop(CellStyle.BORDER_THIN);//上邊框
style.setBorderRight(CellStyle.BORDER_THIN);//右邊框
return style;
}
/**
* 設置字體
* @param style
* @return
*/
public CellStyle setFont(CellStyle style){
HSSFFont font = workbook.createFont();
font.setFontHeightInPoints((short) 12);
font.setFontName("仿宋");
font.setBold(true);
style.setFont(font);
return style;
}
}
在附上一個設置自動篩選的代碼:
CellRangeAddress c = (CellRangeAddress) CellRangeAddress.valueOf(“A2:L2”);
sheet.setAutoFilter(c);
這個不止使用了HSSF的包 還使用了這個
import org.apache.poi.ss.util.CellRangeAddress;
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!