參考:https://www.cnblogs.com/cjbbk/p/7527276.html
解決POI3.17 與其它版本的不同的坑:https://blog.csdn.net/Weirdo_zhu/article/details/79912606
3.17 非常詳細:https://www.cnblogs.com/huajiezh/p/5467821.html
參考:http://www.360doc.com/content/17/1101/11/40984640_699967795.shtml
POI 凍結某一行:
在POI中 有createFreezePane方法能直接固定單元格,具體參數如下:
sheet.createFreezePane(int cellNum,int rowNum,int firstCellNum,int firstRollNum );
四個參數分別代表:
cellNum:表示要凍結的列數;
rowNum:表示要凍結的行數;
firstCellNum:表示被固定列右邊第一列的列號;
firstRollNum :表示被固定行下邊第一列的行號;
注意: 后2個參數均從0開始計算列號和行號,且firstCellNum>=cellNum &&firstRollNum >=cellNum
如:
// 凍結第一行
sheet1.createFreezePane( 0, 1, 0, 1 );
// 凍結第一列
sheet2.createFreezePane( 1, 0, 1, 0 );
sheet.createFreezePane(1,0,1,0);//就是固定了首列,列號的顯示為:A,BCDEF...
sheet.createFreezePane(1,0,3,0);//固定了首列,列號的顯示為:A,DEF...
//注意:BC列不是被隱藏,而是默認顯示列為A,DEF,若想要看BC列,只需移動滾輪即可.行號同理 --------------------- 原文:https://blog.csdn.net/qq_24076135/article/details/77449898?utm_source=copy
依賴:
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.17</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.17</version> </dependency>
注釋,下拉選(生成execl基本使用)
package com.icil.esolution; import static org.junit.Assert.*; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.util.Date; import org.apache.poi.hssf.usermodel.DVConstraint; import org.apache.poi.hssf.usermodel.HSSFClientAnchor; import org.apache.poi.hssf.usermodel.HSSFDataValidation; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.BorderStyle; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.Comment; import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.Drawing; import org.apache.poi.ss.usermodel.Font; import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddressList; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.junit.Test; import org.springframework.boot.autoconfigure.data.cassandra.CassandraReactiveRepositoriesAutoConfiguration; public class ReadExcelByPOITest { @Test public void CreateExceltest01() throws Exception { Workbook[] wbs = new Workbook[] { new HSSFWorkbook(), new XSSFWorkbook() }; Workbook workbook = new HSSFWorkbook(); // 得到一個POI的工具類 CreationHelper createHelper = workbook.getCreationHelper(); // 在Excel工作簿中建一工作表,其名為缺省值, 也可以指定Sheet名稱 Sheet sheet = workbook.createSheet(); // Sheet sheet = workbook.createSheet("SheetName"); // 用於格式化單元格的數據 DataFormat format = workbook.createDataFormat(); // 設置字體 Font font = workbook.createFont(); font.setFontHeightInPoints((short) 20); // 字體高度 font.setColor(Font.COLOR_RED); // 字體顏色 font.setFontName("黑體"); // 字體 // font.setBoldweight(Font.BOLDWEIGHT_BOLD); // 寬度 font.setItalic(true); // 是否使用斜體 // font.setStrikeout(true); //是否使用划線 // 設置單元格類型 CellStyle cellStyle = workbook.createCellStyle(); cellStyle.setBorderBottom(BorderStyle.THIN); // 下邊框 cellStyle.setBorderLeft(BorderStyle.THIN);// 左邊框 cellStyle.setBorderTop(BorderStyle.THIN);// 上邊框 cellStyle.setBorderRight(BorderStyle.THIN);// 右邊框 cellStyle.setFont(font); // cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平布局:居中 cellStyle.setWrapText(true); CellStyle cellStyle2 = workbook.createCellStyle(); cellStyle2.setDataFormat(format.getFormat("#, ## 0.0")); CellStyle cellStyle3 = workbook.createCellStyle(); cellStyle3.setDataFormat(format.getFormat("yyyy-MM-dd HH:mm:ss")); // 添加單元格注釋 // 創建Drawing對象,Drawing是所有注釋的容器. Drawing drawing = sheet.createDrawingPatriarch(); // ClientAnchor是附屬在WorkSheet上的一個對象, 其固定在一個單元格的左上角和右下角. ClientAnchor anchor = createHelper.createClientAnchor(); // 設置注釋位子 anchor.setRow1(0); anchor.setRow2(2); anchor.setCol1(0); anchor.setCol2(2); // 定義注釋的大小和位置,詳見文檔 Comment comment = drawing.createCellComment(anchor); // 設置注釋內容 RichTextString str = createHelper.createRichTextString("hello sea"); comment.setString(str); // 設置注釋作者. 當鼠標移動到單元格上是可以在狀態欄中看到該內容. comment.setAuthor("Sea"); //注釋方法2 // 定義注釋的大小和位置,詳見文檔 /** * 前面四個參數:指定位置://從那一行開始,到那一行結束,從那一列開始,到那一列結束; */ Comment comment1 = drawing.createCellComment(new HSSFClientAnchor(0,0,0,0, (short)4, 2 ,(short) 6, 5)); // 設置注釋內容 comment1.setString(str); //下拉選 //(int firstRow, int lastRow, int firstCol, int lastCol) //從那一行開始,到那一行結束,從那一列開始,到那一列結束; CellRangeAddressList regions = new CellRangeAddressList(0, 65535,0, 0); DVConstraint constraint =DVConstraint.createExplicitListConstraint(new String[] { "百度","阿里", "騰訊" });//限制只能選中這些值,否則報錯 HSSFDataValidation dataValidate = new HSSFDataValidation(regions,constraint); sheet.addValidationData(dataValidate); // 定義幾行 for (int rownum = 0; rownum < 10; rownum++) { // 創建行 Row row = sheet.createRow(rownum); // 創建單元格 Cell cell = row.createCell((short) 1); cell.setCellValue(createHelper.createRichTextString("Hello!" + rownum));// 設置單元格內容 cell.setCellStyle(cellStyle);// 設置單元格樣式 cell.setCellType(Cell.CELL_TYPE_STRING);// 指定單元格格式:數值、公式或字符串 /** * 說明注釋是唯一的,只會加載一個地方,在for 循環中.默認會加載到最后一個地方 */ cell.setCellComment(comment);// 添加注釋 // 格式化數據 Cell cell2 = row.createCell((short) 3); //參數表示在那一列顯示(起始值為0) cell2.setCellValue(11111.25); cell2.setCellStyle(cellStyle2); Cell cell3 = row.createCell((short) 7); cell3.setCellValue(new Date()); cell3.setCellStyle(cellStyle3); sheet.autoSizeColumn((short) 1); // 調整第一列寬度 //數子是+1 列 sheet.autoSizeColumn((short) 3); // 調整第二列寬度 sheet.autoSizeColumn((short) 0); // 調整第三列寬度 sheet.autoSizeColumn((short) 7); // 調整第四列寬度 } // 合並單元格//四個參數:前兩個表示行:從哪行開始到哪一行結束 后面兩個參數:從哪一列開始到哪以咧結束 sheet.addMergedRegion(new CellRangeAddress(1, // 第一行(0) 2, // last row(0-based) 1, // 第一列(基於0) 2 // 最后一列(基於0) )); // 保存 String filename = "/home/sea/Desktop/workbook01.xls"; if (workbook instanceof XSSFWorkbook) { filename = filename + "x"; } FileOutputStream out = new FileOutputStream(filename); workbook.write(out); out.close(); } }
自定義下拉選錯誤提示 可參考:http://wuhaidong.iteye.com/blog/2039848
/** * excel添加下拉數據校驗 * @param sheet 哪個 sheet 頁添加校驗 * @param dataSource 數據源數組 * @param col 第幾列校驗(0開始) * @return */ public static DataValidation createDataValidation(Sheet sheet, String[] dataSource, int col) { CellRangeAddressList cellRangeAddressList = new CellRangeAddressList(1, 65535, col, col); DataValidationHelper helper = sheet.getDataValidationHelper(); DataValidationConstraint constraint = helper.createExplicitListConstraint(dataSource); DataValidation dataValidation = helper.createValidation(constraint, cellRangeAddressList); //處理Excel兼容性問題 if (dataValidation instanceof XSSFDataValidation) { dataValidation.setSuppressDropDownArrow(true); dataValidation.setShowErrorBox(true); } else { dataValidation.setSuppressDropDownArrow(false); } dataValidation.setEmptyCellAllowed(true); dataValidation.setShowPromptBox(true); dataValidation.createPromptBox("提示", "只能選擇下拉框里面的數據"); return dataValidation; } 作者:賽亞人之神 鏈接:https://www.jianshu.com/p/3fb7feca9685 來源:簡書 簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
未修改:聯動
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import org.apache.poi.hssf.usermodel.DVConstraint; 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.HSSFDataValidation; import org.apache.poi.hssf.usermodel.HSSFFont; 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.HSSFColor; import org.apache.poi.ss.usermodel.DataValidation; import org.apache.poi.ss.usermodel.Name; import org.apache.poi.ss.util.CellRangeAddressList; public class ExcelLinkage { // 樣式 private HSSFCellStyle cellStyle; // 初始化省份數據 private List<String> province = new ArrayList<String>(Arrays.asList("湖南", "廣東")); // 初始化數據(湖南的市區) private List<String> hnCity = new ArrayList<String>(Arrays.asList("長沙市", "邵陽市")); // 初始化數據(廣東市區) private List<String> gdCity = new ArrayList<String>(Arrays.asList("深圳市", "廣州市")); public void setDataCellStyles(HSSFWorkbook workbook, HSSFSheet sheet) { cellStyle = workbook.createCellStyle(); // 設置邊框 cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); // 設置背景色 cellStyle.setFillForegroundColor(HSSFColor.LIGHT_GREEN.index); cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); // 設置居中 cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT); // 設置字體 HSSFFont font = workbook.createFont(); font.setFontName("宋體"); font.setFontHeightInPoints((short) 11); // 設置字體大小 cellStyle.setFont(font);// 選擇需要用到的字體格式 // 設置單元格格式為文本格式(這里還可以設置成其他格式,可以自行百度) HSSFDataFormat format = workbook.createDataFormat(); cellStyle.setDataFormat(format.getFormat("@")); } /** * 創建數據域(下拉聯動的數據) * * @param workbook * @param hideSheetName * 數據域名稱 */ private void creatHideSheet(HSSFWorkbook workbook, String hideSheetName) { // 創建數據域 HSSFSheet sheet = workbook.createSheet(hideSheetName); // 用於記錄行 int rowRecord = 0; // 獲取行(從0下標開始) HSSFRow provinceRow = sheet.createRow(rowRecord); // 創建省份數據 this.creatRow(provinceRow, province); // 根據省份插入對應的市信息 rowRecord++; for (int i = 0; i < province.size(); i++) { List<String> list = new ArrayList<String>(); // 我這里是寫死的 , 實際中應該從數據庫直接獲取更好 if (province.get(i).toString().equals("湖南")) { // 將省份名稱放在插入市的第一列, 這個在后面的名稱管理中需要用到 list.add(0, province.get(i).toString()); list.addAll(hnCity); } else { list.add(0, province.get(i).toString()); list.addAll(gdCity); } //獲取行 HSSFRow Cityrow = sheet.createRow(rowRecord); // 創建省份數據 this.creatRow(Cityrow, list); rowRecord++; } } /** * 創建一列數據 * * @param currentRow * @param textList */ public void creatRow(HSSFRow currentRow, List<String> text) { if (text != null) { int i = 0; for (String cellValue : text) { // 注意列是從(1)下標開始 HSSFCell userNameLableCell = currentRow.createCell(i++); userNameLableCell.setCellValue(cellValue); } } } /** * 名稱管理 * * @param workbook * @param hideSheetName * 數據域的sheet名 */ private void creatExcelNameList(HSSFWorkbook workbook, String hideSheetName) { Name name; name = workbook.createName(); // 設置省名稱 name.setNameName("province"); name.setRefersToFormula(hideSheetName + "!$A$1:$" + this.getcellColumnFlag(province.size())+ "$1"); // 設置省下面的市 for (int i = 0; i < province.size(); i++) { List<String> num = new ArrayList<String>(); if (province.get(i).toString().equals("湖南")) { name = workbook.createName(); num.add(0,province.get(i).toString()); num.addAll(hnCity); name.setNameName(province.get(i).toString()); name.setRefersToFormula(hideSheetName + "!$B$" + (i + 2) + ":$" + this.getcellColumnFlag(num.size()) + "$" + (i + 2)); } else { name = workbook.createName(); num.add(0,province.get(i).toString()); num.addAll(gdCity); name.setNameName(province.get(i).toString()); name.setRefersToFormula(hideSheetName + "!$B$" + (i + 2) + ":$" + this.getcellColumnFlag(num.size()) + "$" + (i + 2)); } } } // 根據數據值確定單元格位置(比如:28-AB) private String getcellColumnFlag(int num) { String columFiled = ""; int chuNum = 0; int yuNum = 0; if (num >= 1 && num <= 26) { columFiled = this.doHandle(num); } else { chuNum = num / 26; yuNum = num % 26; columFiled += this.doHandle(chuNum); columFiled += this.doHandle(yuNum); } return columFiled; } private String doHandle(final int num) { String[] charArr = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" }; return charArr[num - 1].toString(); } /** * 使用已定義的數據源方式設置一個數據驗證 * * @param formulaString * @param naturalRowIndex * @param naturalColumnIndex * @return */ public DataValidation getDataValidationByFormula(String formulaString, int naturalRowIndex, int naturalColumnIndex) { // 加載下拉列表內容 DVConstraint constraint = DVConstraint .createFormulaListConstraint(formulaString); // 設置數據有效性加載在哪個單元格上。 // 四個參數分別是:起始行、終止行、起始列、終止列 int firstRow = naturalRowIndex; int lastRow = naturalRowIndex; int firstCol = naturalColumnIndex - 1; int lastCol = naturalColumnIndex - 1; CellRangeAddressList regions = new CellRangeAddressList(firstRow, lastRow, firstCol, lastCol); // 數據有效性對象 DataValidation data_validation_list = new HSSFDataValidation(regions, constraint); return data_validation_list; } /** * 創建一列數據 * * @param hssfSheet */ public void creatAppRow(HSSFSheet hssfSheet, int naturalRowIndex) { // 獲取行 HSSFRow hssfRow = hssfSheet.createRow(naturalRowIndex); HSSFCell province = hssfRow.createCell(0); province.setCellValue(""); province.setCellStyle(cellStyle); HSSFCell City = hssfRow.createCell(1); City.setCellValue(""); City.setCellStyle(cellStyle); // 得到驗證對象 DataValidation data_validation_list1 = this.getDataValidationByFormula( "province", naturalRowIndex, 1); DataValidation data_validation_list2 = this .getDataValidationByFormula("INDIRECT($A" + (naturalRowIndex + 1) + ")", naturalRowIndex, 2); // 工作表添加驗證數據 hssfSheet.addValidationData(data_validation_list1); hssfSheet.addValidationData(data_validation_list2); } public void Export() { try { File file = new File("F:/excel.xls"); FileOutputStream outputStream = new FileOutputStream(file); // 創建excel HSSFWorkbook workbook = new HSSFWorkbook(); // 設置sheet 名稱 HSSFSheet excelSheet = workbook.createSheet("excel"); // 設置樣式 this.setDataCellStyles(workbook, excelSheet); // 創建一個隱藏頁和隱藏數據集 this.creatHideSheet(workbook, "shutDataSource"); // 設置名稱數據集 this.creatExcelNameList(workbook, "shutDataSource"); // 創建一行數據 for (int i = 0; i < 50; i++) { this.creatAppRow(excelSheet,i); } workbook.write(outputStream); outputStream.close(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { ExcelLinkage linkage = new ExcelLinkage(); linkage.Export(); } }
