Java——poi操做Excel

Java——poi操做Excel

應用的poi.jar包版本爲:3.16java

一、讀取xlsx

(1)、寫讀Excel類

package poi;

import java.io.FileInputStream;
import java.io.IOException;
import java.util.Iterator;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcel2 {
	// 讀取xlsx的數據
	public static String readDataExcelx(String filePath) throws IOException{
		StringBuilder str = new StringBuilder();
		FileInputStream input = null;
		try {
			// 打開filePath這個路徑下指定的文件
			input = new FileInputStream(filePath);
			XSSFWorkbook workbook = new XSSFWorkbook(input);
			// 獲取第一個sheet
			XSSFSheet sheet0 = workbook.getSheetAt(0);
			// 迭代行
			for (Iterator<Row> rowIterator = sheet0.iterator(); rowIterator.hasNext();) {
				XSSFRow row = (XSSFRow) rowIterator.next();
				// 迭代一行中全部的列
				for (Iterator<Cell> iterator = row.cellIterator(); iterator.hasNext();) {
					XSSFCell cell = (XSSFCell) iterator.next();
					// 根據單元的的類型 讀取相應的結果
					if (cell.getCellTypeEnum() == CellType.STRING)
						str.append(cell.getStringCellValue() + "\t");
					else if (cell.getCellTypeEnum() == CellType.NUMERIC)
						str.append(cell.getNumericCellValue() + "\t");
					else if (cell.getCellTypeEnum() == CellType.FORMULA)
						str.append(cell.getCellFormula() + "\t");

				}
				// 換行
				str.append("\n");
			}

		} catch (Exception e) {
			// 上拋異常
			throw new IOException(e);
		} finally {
			if(input!=null){
				try {
					// 關閉輸入流
					input.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
		// 返回數據的字符串
		return str.toString();
	}

	// 測試讀入的數據
	public static void main(String[] args) {
		String str;
		try {
			str = readDataExcelx("d:\\測試.xlsx");
			System.out.println(str);
		} catch (IOException e) {		
			e.printStackTrace();
		}
		
	}
}

(2)、顯示效果

二、寫入Xlsx

建立一個WriteExcel類,書寫如下幾個方法apache

package poi;
public class WriteExcel {
    // 設置邊框方法
    public static void setBorder(){}
    // 設置字體方法
    public static void getFont(){}
    // 設置下拉框方法
    public static XSSFSheet setXSSFDropdown(){}
    // 建立Excel方法
	public static void createXlsx(){}
    // 測試main方法
    public static void main(String[] args) {}
}

由於寫入內容過多,因此將寫入拆分紅幾塊數組

(1)、設置邊框方法

/**
	 * ---------------------設置邊框---------------------------
	 * @param cellStyle		表格類型對象
	 * @param topBorder		設置上邊框
	 * @param bottomBorder	設置下邊框
	 * @param leftBorder	設置左邊框
	 * @param rightBorder	設置右邊框
	 * @param borderStyle	設置邊框類型
	 */
	public static void setBorder(CellStyle cellStyle, boolean topBorder, boolean bottomBorder, boolean leftBorder,
			boolean rightBorder, BorderStyle borderStyle) {
		// 若是borderStyle爲空,則設置爲無樣式
		if(borderStyle==null){
			borderStyle=BorderStyle.NONE;
		}
		if (topBorder) {
			cellStyle.setBorderTop(borderStyle);
		}
		if (bottomBorder) {
			cellStyle.setBorderBottom(borderStyle);
		}
		if (leftBorder) {
			cellStyle.setBorderLeft(borderStyle);
		}
		if (rightBorder) {
			cellStyle.setBorderRight(borderStyle);
		}
	}

(2)、設置字體方法

/**
	 * -----------------得到字體以及配置字體類型---------------------
	 * @param workbook  Excel對象
	 * @param fontName  字體名
	 * @param fontSize  字體大小
	 * @param fontColor 字體顏色
	 * @param bold 		加粗
	 * @param italic	傾斜
	 * @param Underline	下劃線
	 * @return			返回字體
	 */
	public static XSSFFont getFont(XSSFWorkbook workbook, String fontName, int fontSize, int[] fontColor, boolean bold,
			boolean italic,int Underline) {
		// 建立字體對象
		if (workbook == null) {
			throw new RuntimeException("workbook值爲空");
		}
		XSSFFont font = workbook.createFont();
		// 設置字體名字
		if (fontName != null) {
			font.setFontName(fontName);
		}
		// 設置字體顏色
		if (fontColor != null) {
			XSSFColor color = new XSSFColor();
			color.setRGB(new byte[] { (byte) fontColor[0], (byte) fontColor[1], (byte) fontColor[2] });
			font.setColor(color);
		}
		// 設置字體大小
		if (fontSize > 0) {
			font.setFontHeightInPoints((short) fontSize);
		}
		// 設置字體加粗
		font.setBold(bold);
		// 設置字體傾斜
		font.setItalic(italic);
		// 設置字體下劃線
		font.setUnderline((byte)Underline);
		// 返回字體
		return font;
	}

(3)、設置下拉框方法

/**
	 * -----------------設置下拉框---------------------------
	 * @param sheetlist	 要設置的sheet.
	 * @param textlist	 下拉框顯示的內容
	 * @param firstRow	 開始行
	 * @param endRow 	 結束行
	 * @param firstCol 	 開始列
	 * @param endCol 	 結束列
	 * @return 			 設置好的sheet.
	 */
	public static XSSFSheet setXSSFDropdown(XSSFSheet sheetlist, String[] textlist, int firstRow, int endRow,
			int firstCol, int endCol) {
		// 設置數據有效性加載在哪一個單元格上,四個參數分別是:起始行、終止行、起始列、終止列
		CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);
		// 數據有效性對象
		XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheetlist);
		XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint) dvHelper.createExplicitListConstraint(textlist);
		XSSFDataValidation validation = (XSSFDataValidation) dvHelper.createValidation(dvConstraint, regions);
		sheetlist.addValidationData(validation);
		return sheetlist;
	}

(4)、生成表格的主方法

/**
	 * 
	 * @param filepath      要建立的xlsx文件目錄
	 * @param list			Object[]數據列表
	 */
	public static void createXlsx(String filepath, List<Object[]> list) throws IOException {
		// -------------------建立Excel---------------------
		// Excel對象
		XSSFWorkbook workbook = new XSSFWorkbook();
		// 建立一個sheet0
		XSSFSheet sheet0 = workbook.createSheet("產品清單");
	
		// -------------------配置表格類型---------------------
		// 建立表格類型對象
		CellStyle cellStyle=workbook.createCellStyle();
		
		/*
		 * CellStyle.BORDER_DOUBLE 雙邊線 
		 * CellStyle.BORDER_THIN 細邊線
		 * CellStyle.BORDER_MEDIUM 中等邊線 
		 * CellStyle.BORDER_DASHED 虛線邊線
		 * CellStyle.BORDER_HAIR 小圓點虛線邊線
		 * CellStyle.BORDER_THICK 粗邊線
		 */
		// 調用方法setBorder設置表格類型的底邊框
		setBorder(cellStyle,true, true, true, true, BorderStyle.DASHED);
		
		// 調用方法getFont得到字體對象getFont
		// ("workbook對象","字體","字體大小","顏色數組(255,255,255),"加粗","傾斜","下劃線(0爲沒下劃線)")
		XSSFFont font = getFont(workbook, "微軟雅黑", 10, new int[] { 255, 0, 0 }, false, false, 0);
		// 將字體加入到表格類型中
		cellStyle.setFont(font);
		
		// 設置內容居中
		cellStyle.setAlignment(HorizontalAlignment.CENTER);
		
		// -------------------建立表頭---------------------
		// 設置表頭要顯示的內容
		String[] title = { "編號", "產品名稱", "產品價格", "產品數量", "生產日期" };
		// 建立第一行(第一行爲標號爲0)
		XSSFRow row0 = sheet0.createRow((short) 0);
		// 循環建立第一行表格(第一列標號爲0,i=開始的列,title.length-1=結束的列)
		for (int i = 0; i <= title.length - 1; i++) {
			// 建立表格對象
			XSSFCell cell = row0.createCell(i);
			// 設置表格類型
			cell.setCellStyle(cellStyle);
			// 設置表格對象值
			cell.setCellValue(title[i]);
			// 想合併最後的單元格,則判到最後列後合併單元格
			if (i == title.length - 1) {
				// 建立表格對象
				row0.createCell(i + 1).setCellStyle(cellStyle);
				// 合併單元格CellRangeAddress(開始行,結束行, 開始列, 結束列)
				row0.getSheet().addMergedRegion(new CellRangeAddress(0, 0, i, i + 1));
			}
		}

		// -------------------建立內容--------------------
		//設置下拉選項的菜單
		String[] dropdownList = { "產品1號", "產品2號", "產品3號" ,"產品4號" };
		
		// 循環生成行N行
		for (int rownum = 1; rownum <= list.size() - 1; rownum++) {
			// 建立行對象
			XSSFRow row = sheet0.createRow((short) rownum);
			// 循環生成行表格
			for (int colnum = 0; colnum <= list.get(rownum).length - 1; colnum++) {
				// 建立表格對象
				XSSFCell cells = row.createCell(colnum);
				// 設置表格類型
				cells.setCellStyle(cellStyle);
				// 從集合中提取數據
				cells.setCellValue((String) list.get(rownum - 1)[colnum]);
				// 判斷是不是第二列,是則加入下拉列表
				if (colnum == 1) {
					//調用方法setXSSFDropdown建立下拉列表
					setXSSFDropdown(sheet0, dropdownList, rownum, rownum, colnum, colnum);
				}
				// 想合併最後的單元格,則判到最後列後合併單元格
				if (colnum == title.length - 1) {
					// 建立表格對象
					row.createCell(colnum + 1).setCellStyle(cellStyle);
					// 合併單元格CellRangeAddress(開始行,結束行, 開始列, 結束列)
					row.getSheet().addMergedRegion(new CellRangeAddress(rownum, rownum, colnum, colnum + 1));
				}
			}
		}

		// 建立輸出流
		FileOutputStream out = new FileOutputStream(filepath);
		BufferedOutputStream bos = new BufferedOutputStream(out);

		// 寫入文件到緩衝流中輸出
		workbook.write(bos);
		bos.close();
	}

(4)、測試的main方法

// 測試
	public static void main(String[] args) {
		try {
			// 建立測試用的數據
			List<Object[]> list = new ArrayList<Object[]>();
			list.add(new Object[] { "001", "產品1號", "1000.0", "20", "2017-07-11" });
			list.add(new Object[] { "002", "產品2號", "1200.0", "55", "2017-07-12" });
			list.add(new Object[] { "003", "產品3號", "1350.0", "42", "2017-07-13" });
			list.add(new Object[] { "004", "產品4號", "1400.0", "99", "2017-07-14" });
			// 設置保存目錄
			String filepath="d://test.xlsx";
			// 調用法法
			createXlsx(filepath, list);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

(5)、顯示效果

三、修改Xlsx

(1)、修改生成的test.xlsx文件

往其中插入一行app

package poi;

import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ModifyExcel {
	public static void Modify(String filepath) throws IOException {
		FileInputStream input = null;
		FileOutputStream out = null;
		try {
			// ------讀取Excel到Java中-------
			input = new FileInputStream(filepath);
			XSSFWorkbook workbook = new XSSFWorkbook(input);

			// ------得到Excel中第1個表-------
			XSSFSheet sheet = workbook.getSheetAt(0);

			// ------把已有的行往下移動--------
			// 設置要移動的是第幾行
			int n = 2;
			// sheet.getLastRowNum()爲獲取最後一行
			// shiftRows(開始行,結束行,移動多少行,是否保留行高,從新設置行高);
			for (int i = sheet.getLastRowNum(); i >= n; i--) {
				sheet.shiftRows(i, i, 1, true, false);
			}

			// ------插入行--------
			// 設置要插入的數據
			String[] data = new String[] { "001", "產品1號", "1000.0", "20", "2017-07-11" };
			// 在第N行插入一行
			XSSFRow row = sheet.createRow(n);
			// 循環建立表格
			for (int i = 0; i <= data.length - 1; i++) {
				XSSFCell cell=row.createCell(i);
				// 若是是最後的單元格,則判到最後列後合併單元格
				if (i == data.length - 1) {
					// 建立表格對象
					row.createCell(i);
					// 合併單元格CellRangeAddress(開始行,結束行, 開始列, 結束列)
					row.getSheet().addMergedRegion(new CellRangeAddress(n, n, i, i + 1));
				}
				cell.setCellValue(data[i]);
			}

			// ------建立輸出流--------
			out = new FileOutputStream(filepath);
			BufferedOutputStream bos = new BufferedOutputStream(out);

            // ------寫入到流--------
			workbook.write(bos);
		} catch (IOException e) {
			throw new IOException(e);
		} finally {
            // ------關閉流--------
			if(input!=null){
				input.close();
			}
			if(out!=null){
				out.close();
			}
		}
	}

	public static void main(String[] args){
		try {
			Modify("d:\\test.xlsx");
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

(2)、顯示效果

相關文章
相關標籤/搜索