文档章节

在EXCEL指定SHEET页,指定文字位置,插入批注

zhaochaochao
 zhaochaochao
发布于 09/19 15:22
字数 1060
阅读 18
收藏 0

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();  
      
        }  
}
 

© 著作权归作者所有

共有 人打赏支持
zhaochaochao
粉丝 1
博文 93
码字总数 34638
作品 0
郑州
程序员
POI对excel的操作

大概07年9月份左右,工作大量用到poi处理表格,通过表格进行数据更新插入,以及数据生成表格等操作,在这里进行总结,并在下一章总结对word文档的操作 0.首先在excle文件中: HSSFWorkbook是操...

huaizhe
02/26
0
0
jxl本地excel的导入导出

一、从指定位磁盘的excel文件中导入数据并保存数据库: package com.inspur; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import......

QH_C
2014/11/08
0
0
C# 如何在Excel表格中插入、编辑和删除批注

概述 为文档添加必要的批注可以给文档使用者提供重要的提示信息,下面的示例中,将介绍通过C#编程语言来给Excel表格中的指定单元格内容添加批注,此外,对于已有的批注,如果需要修改,我们也...

E_iceblue
06/15
0
0
JAVA利用JXL导出/生成 EXCEL

在开发中很多时间需要导出数据库中的一些数据到excel中!昨天就研究了一下……用JXL导出excel /** 导出导出采暖市场部收入、成本、利润明细表 @author JIA-G-Y */public String exporExcel(S...

郏高阳
2012/11/13
0
3
Apache POI使用详解

1.POI结构与常用类 (1)POI介绍 Apache POI是Apache软件基金会的开源项目,POI提供API给Java程序对Microsoft Office格式档案读和写的功能。 .NET的开发人员则可以利用NPOI (POI for .NET) 来存...

小湘西
2016/07/26
125
2

没有更多内容

加载失败,请刷新页面

加载更多

Shell特殊符号总结以及cut,sort,wc,uniq,tee,tr,split命令

特殊符号总结一 * 任意个任意字符 ? 任意一个字符 # 注释字符 \ 脱义字符 | 管道符 # #号后的备注被忽略[root@centos01 ~]# ls a.txt # 备注 a.txt[root@centos01 ~]# a=1[root@centos01...

野雪球
59分钟前
2
0
OSChina 周二乱弹 —— 程序员圣衣

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @达尔文:分享Skeeter Davis的单曲《The End of the World》 《The End of the World》- Skeeter Davis 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
5
0
[ python import module ] 导入模块

import moudle_name ----> import module_name.py ---> import module_name.py文件路径 -----> sys.path (这里进行查找文件) # from app.web import Personimport app.web.Person as Pe......

_______-
昨天
4
0
Redis性能问题排查解决手册

一、性能相关的数据指标 通过Redis-cli命令行界面访问到Redis服务器,然后使用info命令获取所有与Redis服务相关的信息。通过这些信息来分析文章后面提到的一些性能指标。 nfo命令输出的数据可...

IT--小哥
昨天
2
0
mixin混入

①新建mixin.js文件 const mixin = { methods: { /** * 分页公共方法 */ handleSizeChange(val) { this.pageData.size = val; this.query(); }, hand......

不负好时光
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部