在EXCEL指定SHEET页,指定文字位置,插入批注
2019獨角獸企業重金招聘Python工程師標準>>>
Java操作EXCEL文件,利用POI,在EXCEL指定SHEET頁中指定文字位置處插入批注
第一種:會覆蓋原來的備注
package excel;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.util.CellReference;
public class ExcelUtils {
?? ?public static void main(String[] args) {
?? ??? ?String fin = "E:\\ceshi\\hello.xls";
?? ??? ?String fout = "E:\\ceshi\\ceshi.xls";
?? ??? ?String sheetname = "火龍果";
?? ??? ?String cellmsg = "AAA";
?? ??? ?WriteLetter(fin, fout, sheetname, cellmsg);
?? ?}
?? ?/**
?? ? *?
?? ? * @param fin原始文件位置
?? ? * @param fout 輸出文件位置
?? ? * @param sheetname SHEET頁名稱
?? ? * @param cellmsg?? ?要查詢的文字位置
?? ? */
?? ?public static void WriteLetter(String fin, String fout, String sheetname, String cellmsg) {
?? ??? ?try (FileInputStream in = new FileInputStream(fin); FileOutputStream out = new FileOutputStream(fout);) {
?? ??? ??? ?HSSFWorkbook workbook = new HSSFWorkbook(in);// 拿到文件轉化為javapoi可操縱類型
?? ??? ??? ?HSSFSheet sheet = null;
?? ??? ??? ?Cell cellnew = null;
?? ??? ??? ?Integer rownum = null;
?? ??? ??? ?Integer colnum = null;
?? ??? ??? ?for (int i = 0; i < workbook.getNumberOfSheets(); i++) {// 獲取每個Sheet表
?? ??? ??? ??? ?sheet = workbook.getSheetAt(i);
?? ??? ??? ??? ?if (sheetname.equals(sheet.getSheetName())) {
?? ??? ??? ??? ??? ?Boolean flag = false;
?? ??? ??? ??? ??? ?for (Row row : sheet) {
?? ??? ??? ??? ??? ??? ?if (flag) {
?? ??? ??? ??? ??? ??? ??? ?break;// 結束行循環
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?for (Cell cell : row) {
?? ??? ??? ??? ??? ??? ??? ?// 單元格的參照 ,根據行和列確定某一個單元格的位置
?? ??? ??? ??? ??? ??? ??? ?CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());
?? ??? ??? ??? ??? ??? ??? ?String cellname = "";
?? ??? ??? ??? ??? ??? ??? ?// 得到單元格類型
?? ??? ??? ??? ??? ??? ??? ?switch (cell.getCellType()) {
?? ??? ??? ??? ??? ??? ??? ?case Cell.CELL_TYPE_STRING:// String類型單元格
?? ??? ??? ??? ??? ??? ??? ??? ?// 輸出文本
?? ??? ??? ??? ??? ??? ??? ??? ?cellname = cell.getRichStringCellValue().getString();
?? ??? ??? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ??? ??? ?case Cell.CELL_TYPE_NUMERIC:// 數字類型
?? ??? ??? ??? ??? ??? ??? ??? ?// 檢查單元格是否包含一個Date類型
?? ??? ??? ??? ??? ??? ??? ??? ?// 僅僅只檢查Excel內部的日期格式,
?? ??? ??? ??? ??? ??? ??? ??? ?if (DateUtil.isCellDateFormatted(cell)) {
?? ??? ??? ??? ??? ??? ??? ??? ??? ?// 輸出日期
?? ??? ??? ??? ??? ??? ??? ??? ??? ?cellname = cell.getDateCellValue().toString();
?? ??? ??? ??? ??? ??? ??? ??? ?} else {
?? ??? ??? ??? ??? ??? ??? ??? ??? ?// 輸出數字
?? ??? ??? ??? ??? ??? ??? ??? ??? ?cellname = cell.getNumericCellValue() + "";
?? ??? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ??? ??? ?case Cell.CELL_TYPE_BOOLEAN:// Boolean類型
?? ??? ??? ??? ??? ??? ??? ??? ?cellname = cell.getBooleanCellValue() + "";
?? ??? ??? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ??? ??? ?case Cell.CELL_TYPE_FORMULA:// 公式
?? ??? ??? ??? ??? ??? ??? ??? ?// 輸出公式
?? ??? ??? ??? ??? ??? ??? ??? ?cellname = cell.getCellFormula().toString();
?? ??? ??? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ??? ??? ?default:
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ??? ?if (cellmsg.equals(cellname)) {
?? ??? ??? ??? ??? ??? ??? ??? ?System.out.println("找到指定位置了");
?? ??? ??? ??? ??? ??? ??? ??? ?// 打印單元格的位置
?? ??? ??? ??? ??? ??? ??? ??? ?System.out.print(cellRef.formatAsString());
?? ??? ??? ??? ??? ??? ??? ??? ?rownum = 4;// TODO 計算要加批注的位置,行號和列號
?? ??? ??? ??? ??? ??? ??? ??? ?colnum = 4;
?? ??? ??? ??? ??? ??? ??? ??? ?flag = true;
?? ??? ??? ??? ??? ??? ??? ??? ?break;
?? ??? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?}
?? ??? ??? ??? ??? ?break;// 結束sheet循環
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?// 創建繪圖對象
?? ??? ??? ?HSSFPatriarch p = sheet.createDrawingPatriarch();
?? ??? ??? ?// 創建單元格對象,批注插入到4行,1列,B5單元格
?? ??? ??? ?// HSSFCell cell=sheet.createRow(4).createCell(1);
?? ??? ??? ?// 獲取指定單元格
?? ??? ??? ?// cell=sheet.getRow(cell.getRowIndex()).getCell(6);
?? ??? ??? ?if (rownum == null || colnum == null) {
?? ??? ??? ??? ?throw new RuntimeException("查詢不到定位文字位置");
?? ??? ??? ?}
?? ??? ??? ?if (sheet.getRow(rownum) == null) {
?? ??? ??? ??? ?cellnew = sheet.createRow(rownum).createCell(colnum);
?? ??? ??? ?} else {
?? ??? ??? ??? ?if (sheet.getRow(rownum).getCell(colnum) == null) {
?? ??? ??? ??? ??? ?cellnew = sheet.getRow(rownum).createCell(colnum);
?? ??? ??? ??? ?} else {
?? ??? ??? ??? ??? ?cellnew = sheet.getRow(rownum).getCell(colnum);
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?// 插入單元格內容
?? ??? ??? ?// cell.setCellValue(new HSSFRichTextString("批注"));
?? ??? ??? ?// 獲取批注對象
?? ??? ??? ?// (int dx1, int dy1, int dx2, int dy2, short col1, int row1, short col2, int
?? ??? ??? ?// row2)
?? ??? ??? ?// 前四個參數是坐標點,后四個參數是編輯和顯示批注時的大小.
?? ??? ??? ?HSSFComment comment = p.createComment(new HSSFClientAnchor(0, 0, 0, 0, (short) 3, 3, (short) 5, 6));
?? ??? ??? ?// 輸入批注信息
?? ??? ??? ?comment.setString(new HSSFRichTextString("插件批注成功!插件批注成功!"));
?? ??? ??? ?// 添加作者,選中B5單元格,看狀態欄
?? ??? ??? ?comment.setAuthor("系統自動添加");
?? ??? ??? ?// 將批注添加到單元格對象中
?? ??? ??? ?cellnew.setCellComment(comment);
?? ??? ??? ?workbook.write(out);
?? ??? ?} catch (Exception e) {
?? ??? ??? ?e.printStackTrace();
?? ??? ?}
?? ?}
}
?
第二種:xlsx格式的文件,不會覆蓋原來的備注,xls格式文件會覆蓋原來的備注
package excel;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.ss.usermodel.Cell;
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.Drawing;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.RichTextString;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;
public class CellCommentCeshi {
?? ? public static void main(String[] args) throws Exception { ?
?? ??? ? FileInputStream in = new FileInputStream("E://ceshi//hello.xls");
?? ? ? ? ? ?//1.創建一個工作簿對象 ?
?? ? ? ? ? ?Workbook wb = WorkbookFactory.create(in);
?? ? ? ? ? ?//2.得到一個POI的工具類 ?
?? ? ? ? ? ?CreationHelper factory = wb.getCreationHelper(); ?
?? ? ? ? ? ?//3. 創建一個工作表 ?
?? ? ? ? ? ?Sheet sheet = ?wb.getSheetAt(0);
?? ? ? ? ? ? ?
?? ? ? ? ? ?//4.得到一個換圖的對象 ?
?? ? ? ? ? ?Drawing drawing = sheet.createDrawingPatriarch(); ?
?? ? ? ? ? ?//5. ClientAnchor是附屬在WorkSheet上的一個對象, ?其固定在一個單元格的左上角和右下角. ?
?? ? ? ? ? ?ClientAnchor anchor = factory.createClientAnchor(); ?
?? ? ? ? ? ? ?
?? ? ? ? ? ?//6. 創建一個單元格(2A單元格) ?
?? ? ? ? ? ?Cell cell0 = sheet.createRow(1).createCell(0); ?
?? ? ? ? ? ?//6.1. 對這個單元格設置值 ?
?? ? ? ? ? ?cell0.setCellValue("Test"); ?
?? ? ? ? ? ?//6.2. 對這個單元格加上注解 ?
?? ? ? ? ? ?Comment comment0 = drawing.createCellComment(anchor); ?
?? ? ? ? ? ?RichTextString str0 = factory.createRichTextString("Hello, World!"); ?
?? ? ? ? ? ?comment0.setString(str0); ?
?? ? ? ? ? ?comment0.setAuthor("Apache POI"); ?
?? ? ? ? ? ?cell0.setCellComment(comment0); ?
?? ? ? ? ? ? ?
?? ? ? ? ? ?//7. 創建一個單元格(4F單元格) ?
?? ? ? ? ? ?Cell cell1 = sheet.createRow(3).createCell(5); ?
?? ? ? ? ? ?//7.1. 對這個單元格設置值 ?
?? ? ? ? ? ?cell1.setCellValue("F4"); ?
?? ? ? ? ? ?//7.2. 對這個單元格加上注解 ?
?? ? ? ? ? ?Comment comment1 = drawing.createCellComment(anchor); ?
?? ? ? ? ? ?RichTextString str1 = factory.createRichTextString("Hello, World!"); ?
?? ? ? ? ? ?comment1.setString(str1); ?
?? ? ? ? ? ?comment1.setAuthor("Apache POI"); ?
?? ? ? ? ? ?cell1.setCellComment(comment1); ?
?? ? ?
?? ? ? ? ? ?//8. 創建一個單元格(4F單元格) ?
?? ? ? ? ? ?Cell cell2 = sheet.createRow(2).createCell(2); ?
?? ? ? ? ? ?cell2.setCellValue("C3"); ?
?? ? ?
?? ? ? ? ? ?Comment comment2 = drawing.createCellComment(anchor); ?
?? ? ? ? ? ?RichTextString str2 = factory.createRichTextString("XSSF can set cell comments"); ?
?? ? ? ? ? ?//9。為注解設置字體 ?
?? ? ? ? ? ?Font font = wb.createFont(); ?
?? ? ? ? ? ?font.setFontName("Arial"); ?
?? ? ? ? ? ?font.setFontHeightInPoints((short)14); ?
?? ? ? ? ? ?font.setBoldweight(Font.BOLDWEIGHT_BOLD); ?
?? ? ? ? ? ?font.setColor(IndexedColors.RED.getIndex()); ?
?? ? ? ? ? ?str2.applyFont(font); ?
?? ? ?
?? ? ? ? ? ?comment2.setString(str2); ?
?? ? ? ? ? ?comment2.setAuthor("Apache POI"); ?
?? ? ? ? ? ?comment2.setColumn(2); ?
?? ? ? ? ? ?comment2.setRow(2); ?
?? ? ? ? ? ?//10. 保存成Excel文件 ?
?? ? ? ? ? ?String fname = "E://ceshi//hello2.xls"; ?
?? ? ? ? ? ?FileOutputStream out = new FileOutputStream(fname); ?
?? ? ? ? ? ?wb.write(out); ?
?? ? ? ? ? ?out.close(); ?
?? ? ?
?? ? ? ?} ?
}
?
轉載于:https://my.oschina.net/sky2008/blog/2056242
總結
以上是生活随笔為你收集整理的在EXCEL指定SHEET页,指定文字位置,插入批注的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 洛谷P1337 [JSOI2004]平衡
- 下一篇: day9 函数