将Excel表格数据转为word的指定位置

想要的结果是excel的一行数据,转换为一个word,并且更改为指定的位置。

首先使用的excel和word 是xlsx和docx格式的哦,其他格式的请自行修改哦。
我们使用Maven进行jar包的管理,
使用了两个poi的jar poi-ooxml,poi-scratchpad

        <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.9</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.17</version></dependency>

首先先看excel的格式,

第一行是需要的数据的名称,从第二行开始就是需要的数据了。

首先在代码中指定excel地址以及实用的word模板是不现实的我们使用config.properties进行配置

//模板位置
fileSrc=D:\\MyProject\\008.docx
//生成word文件夹
fileDest=D:\\MyProject\\
//excel位置
excelSrc=D:\\MyProject\\007.xlsx
//Excel表名字
SheetName=Sheet1

并且在项目中将数据读取出来。

   /*** 读取配置文件** @return*/private Properties readP() {InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("config.properties");Properties p = new Properties();try {p.load(inputStream);} catch (IOException e1) {e1.printStackTrace();}return p;}

在java中读取需要数据的excel文档

 public static void main(String[] args) throws Exception{Excel_Tool excel_tool=new Excel_Tool();Properties p = excel_tool.readP();// 配置文件读取的参数String fielName = p.getProperty("excelSrc");String sheetName =  p.getProperty("SheetName");// readExcelData(fielName,sheetName,2,2);readExcelData(fielName,sheetName,p);}
public static void readExcelData(String fielName,String sheetName,Properties p) throws Exception{InputStream in = new FileInputStream(fielName);workbook = new XSSFWorkbook(in);sheet = workbook.getSheet(sheetName);//row = sheet.getRow(0);//一行总共的列数。int columnNum = sheet.getRow(0).getLastCellNum()- sheet.getRow(0).getFirstCellNum();//总共的行数int rowNum=sheet.getLastRowNum();ArrayList columnList=new ArrayList();row =sheet.getRow(0);for (int i = 0; i <columnNum ; i++) {cell=row.getCell(i);String column=getCell(cell);columnList.add(column);//判断需要哪一列数据,将所有的列名都保存在list中}getData(columnList,rowNum,p);}
   public static String getData(ArrayList arrayList,int rowNum,Properties p){//添加需要的列的名称int bmdmc_col=arrayList.indexOf("bmdmc");int xm_col=arrayList.indexOf("xm");int ksbh_col=arrayList.indexOf("ksbh");int xb_col=arrayList.indexOf("xb");for (int j = 0; j <rowNum ; j++) {Student student=new Student();XSSFRow row=sheet.getRow(j+1);XSSFCell cell=row.getCell(bmdmc_col);String result=getCell(cell);student.setBmdmc(result);cell=row.getCell(xm_col);result=getCell(cell);student.setName(result);cell=row.getCell(ksbh_col);result=getCell(cell);student.setKsbh(result);cell=row.getCell(xb_col);result=getCell(cell);student.setXb(result);//将excel数据写入wordWord_Tool.updateWord(student,p);}return null;}

上面方法我写死了属性名,其实可以利用配置文件将属性名循环查询以及循环调出。后期再进行更改,先利用index获取了bmdmc,xm等等列名的位置,然后获取每一行这一列的数据。

  public static String getCell(XSSFCell cell){String result="";switch (cell.getCellType()){case XSSFCell.CELL_TYPE_NUMERIC:result=String.valueOf(cell.getNumericCellValue());break;case XSSFCell.CELL_TYPE_STRING:result=cell.getStringCellValue();break;default:result=cell.getStringCellValue();break;}return result;}

上面是返回excel每一个单元格的数据方法。
然后将这些数据保存在对象里面,excel中的数据我们就获取完毕了。然后我们要将这些数据写入到word的指定位置中。

 public static void updateWord(Student student,Properties p){Word_Tool test = new Word_Tool();Map<String, Object> param = new HashMap<String, Object>();List<String> keyList = new ArrayList<String>();List<Object> valueList = new ArrayList<Object>();// 获取配置文件所有键值对Iterator<Object> iterator = p.keySet().iterator();while (iterator.hasNext()) {keyList.add(iterator.next().toString());}Iterator<Object> iterator2 = p.keySet().iterator();while (iterator2.hasNext()) {valueList.add(p.getProperty(iterator2.next().toString()));}for (int i = 0; i < keyList.size(); i++) {System.out.println(keyList.get(i) + ":" + valueList.get(i));param.put(keyList.get(i), valueList.get(i));}// 替换文档关键字WordUtil.generateWord(param, param.get("fileSrc").toString(), param.get("fileDest").toString(),student);}

这里的键值对以及fileSrc,fileDest都是配置文件中的属性,

//模板位置
fileSrc=D:\\MyProject\\008.docx
//生成word文件夹
fileDest=D:\\MyProject\\
//excel位置
excelSrc=D:\\MyProject\\007.xlsx
//Excel表名字
SheetName=Sheet1
////对应Student的属性名-自己添加
{{s.ksbh}}=Ksbh
{{s.xm}}=Name
{{s.xb}}=Xb
{{s.bydw}}=Bydw

这就要提出我们再word中指定位置的地方就是你需要用excel文件数据更改的地方了。

就像这样。可以知道word中数据的位置。
下来首先我们要将这个word模板复制一下,生成一个新的word,每个student一个word。

 public static void generateWord(Map<String, Object> param, String fileSrc, String fileDest, Student student) {XWPFDocument doc = null;OPCPackage pack = null;String fileName = "" + student.getName();fileName += ".docx";FileOutputStream out = null;try {out = new FileOutputStream(fileDest + fileName, true);WordUtil.fileCopy(fileSrc,fileDest + fileName);pack = POIXMLDocument.openPackage(fileDest + fileName);doc = new XWPFDocument(pack);if (param != null && param.size() > 0) {// 处理段落List<XWPFParagraph> paragraphList = doc.getParagraphs();processParagraphs(paragraphList, param, doc,student);//处理表格List<XWPFTable> tablesList=doc.getTables();processTables(tablesList, param, doc,student);}} catch (Exception e) {e.printStackTrace();}try {doc.write(out);pack.close();} catch (IOException e) {e.printStackTrace();}finally {closeStream(out);}}

word中有两个需要处理一个是段落,一个是表格,一般我们的数据都会放在这两个类别中。

 /*** 处理段落,替换关键字** @param paragraphList* @throws FileNotFoundException* @throws InvalidFormatException*/public static void processParagraphs(List<XWPFParagraph> paragraphList, Map<String, Object> param, XWPFDocument doc,Student student)throws InvalidFormatException, FileNotFoundException {if (paragraphList != null && paragraphList.size() > 0) {// 遍历所有段落for (XWPFParagraph paragraph : paragraphList) {List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String text = run.getText(0);// System.out.println("text==" + text);if (text != null) {boolean isSetText = false;for (Entry<String, Object> entry : param.entrySet()) {String key = entry.getKey();if (text.indexOf(key) != -1) {// 在配置文件中有这个关键字对应的键isSetText = true;Object value = entry.getValue();if (value instanceof String) {// 文本替换// System.out.println("key==" + key);if (text.contains(key)) {text = text.replace(key, value.toString());}}}}if (isSetText) {run.setText(text, 0);}}}}}}public static void processTables(List<XWPFTable> tablesList, Map<String, Object> param, XWPFDocument doc,Student student)throws InvalidFormatException, FileNotFoundException {if (tablesList != null && tablesList.size() > 0) {// 遍历所有表格List<XWPFTableRow> rows;List<XWPFTableCell> cells;for (XWPFTable table : tablesList) {CTTblPr pr = table.getCTTbl().getTblPr(); // 获取表格对应的行rows = table.getRows();for (XWPFTableRow row : rows) { // 获取行对应的单元格cells = row.getTableCells();for (XWPFTableCell cell : cells) {System.out.println(cell.getText());String text=cell.getText();if (text != null) {boolean isSetText = false;for (Entry<String, Object> entry : param.entrySet()) {String key = entry.getKey();if (text.indexOf(key) != -1) {// 在配置文件中有这个关键字对应的键isSetText = true;Object value = entry.getValue();//根据属性名反射属性值value=getGetMethod(student,value.toString());if (value instanceof String) {// 文本替换// System.out.println("key==" + key);if (text.contains(key)) {text =  value.toString();}}}}if (isSetText) {cell.removeParagraph(0);cell.setText(text);}}}}}}}

上面是直接从配置文件中拿属性值进行填写,下面表格则是使用配置文件获取这个对象word的位置对应的student的属性名,根据反射获取student对象中的数据。将数据进行修改。

//反射数据public static Object getGetMethod(Object ob , String name){try {Method[] m = ob.getClass().getMethods();for(int i = 0;i < m.length;i++){if(("get"+name).toLowerCase().equals(m[i].getName().toLowerCase())){return m[i].invoke(ob);}}}catch (Exception e){e.printStackTrace();}return null;}//复制文档public static void fileCopy(String source, String target) throws IOException {try (InputStream in = new FileInputStream(source)) {try (OutputStream out = new FileOutputStream(target)) {byte[] buffer = new byte[4096];int bytesToRead;while((bytesToRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesToRead);}out.close();}catch (Exception e){e.printStackTrace();}}}

好了,现在我们就能将excel中的数据写入到word中了,而且每个excel一行对应一个word文件。

这个是生成的文件。里面的内容已经更改了。

好了 完工~

将Excel表格数据写入到word的指定位置相关推荐

  1. python处理表格数据-python读取word 中指定位置的表格及表格数据

    1.Word文档如下: 2.代码 # -*- coding: UTF-8 -*- from docx import Document def readSpecTable(filename, specT ...

  2. E013 如何把Excel表格数据写入Ppt文本框内

    Hi,How are you doing? 我是职场编码(CodeVoc). 在E000中,我们介绍了Node.js.Ruby.Electron等工具下载安装. 这期,给你演示一下由Electron联 ...

  3. python办公自动化---将excel表格插入到doc文档指定位置

    应用场景: 目录 应用场景: 问题描述1 问题描述2: 小问题: 需要引入的包 总结: 要求将excel中的表格插入到word文档中 将doc格式转为docx 将表格插入文档 如有需要可以将docx文 ...

  4. Word 邮件合并功能(Excel表中指定列数据插入到Word模板指定位置,批量生成Word)

    [邮件]选项卡[开始邮件合并]下拉按钮,选择[邮件合并分布向导] 在"邮件合并"任务窗格中的"选择文档类型"中选择"信函",单击" ...

  5. java 操作 word 表格和样式,java读取word表格中的表格 java如何读取word中的excel表格数据...

    Java 利用poi 可以直接读取word中的表格保持样式生1.读取word 2003及word 2007需要的jar包 读取 2003 版本(.doc)的word文件相对来说比较简单,只需要 poi ...

  6. python3读取excel数据-Python3读取和写入excel表格数据的示例代码

    python操作excel主要用到 xlrd 和 xlwt 这两个库,xlrd读取excel表格数据, 支持 xlsx和xls格式的excel表格 :xlwt写入excel表格数据: 一.python ...

  7. Python写入和读取Excel表格数据

    Python作为一个强大的数据处理工具,这里简单介绍下python读取写入excel表格数据. 一.python写入excel表格 导入xlwt模块 生成一个空的excel表格,命名为my_test. ...

  8. Excel表格数据该怎么读取和写入之——xlsread函数和xlswrite函数

    Excel表格数据该怎么读取和写入之--xlsread函数和xlswrite函数 excel作为一种数据处理和管理软件,在使用MATLAB时,经常需要对Excel进行读取和写入数据操作. 新人小白,欢 ...

  9. Python3读取和写入excel表格数据

    目录 一.python读取excel表格数据 1.读取excel表格数据常用操作 2.xlrd模块的主要操作 3.读取单元格内容为日期时间的方式 4. 读取合并单元格的数据 二.python写入exc ...

最新文章

  1. JAVA 上加密算法的实现用例---转载
  2. Jquery中设置表格的悬浮和选中时行的背景颜色
  3. TransparentBitmap函数设置透明位图的原理分析
  4. 个人成长:2021如何成为更好的自己?
  5. java Swing中随机验证码的实现
  6. 结合 AOP 轻松处理事件发布处理日志
  7. 项目管理杂谈-员工的积极性在哪里?
  8. 使用NAS动态存储卷创建有状态应用
  9. 安卓学习笔记43:初试开源框架Volley
  10. vista中安装语言包出错解决
  11. gjrand 4.0 发布,C语言的伪随机数生成器
  12. Dijkstra(狄克斯特拉)求加权重的邻接矩阵最短路径(初级版)
  13. mysql5.7主从复制--在线变更复制类型【转】
  14. (转)重写重载多态,接口与类
  15. 大数据竞赛MR培训与题型
  16. c语言 double **x,C语言题目 若已定义x和y为double类型,则表达式“x=1,y=x+3/2的值是:...
  17. phpadmin删除数据库中的用户
  18. python在图片上画矩形
  19. android glide缺少方法,android - 无法膨胀且找不到类android支持设计的行为BottomSheetBehavior - 堆栈内存溢出...
  20. Sixth season seventh episode,Phoebe‘s running style is so free!!!

热门文章

  1. moran指数 r语言_R语言空间数据分析(七):空间自相关
  2. eBay趣事及信用管理
  3. 以图搜图,图像识别...
  4. python爬虫bs4库_04 Python爬虫之Beautiful Soup库
  5. 程序猿生存指南-17 街角咖啡
  6. 错误:10 http://ppa.launchpad.net/fcitx-team/nightly/ubuntu bionic Release 404 Not Foun
  7. 多启动移动硬盘启动盘——目前最好的pe系统
  8. 办公室合租的话需要注意什么问题?合租办公室有什么优缺点吗?
  9. 全志平台H313 移植BCM4354驱动
  10. 抖音视频搬运到YouTube,月入几万