紫玉坏小子

导航

实现操作 数据导入到word、excel操作

实现操作 数据导入到word、excel操作

数据导入到word指定的格式位置上
  • FreeMarker 制作word模板导出

    • FreeMarker是一款模板引擎: 即一种基于模板和要改变的数据, 并用来生成输出文本(HTML网页、电子邮件、配置文件、源代码等)的通用工具。 它不是面向最终用户的,而是一个Java类库,是一款程序员可以嵌入他们所开发产品的组件。

    • <!--添加freeMarker-->
             <dependency>
                 <groupId>org.freemarker</groupId>
                 <artifactId>freemarker</artifactId>
                 <version>2.3.20</version>
             </dependency>
  • word文件的操作

    1. word模板然后将模板转换为xml文件。在word模板中需要定义好我们的占位符哦,使用${string}的方式(主要是为了进行定位)。

    2. 将我们的xml文档的后缀改为ftl,然后用可以打开ftl文件的软件打开我们的ftl文件

    3. 添加freeMarker标签。在表格代码间用自定的标签括起来

    4. 代码

      @Test
        public void exportDoc() throws IOException {

            //创建配置实例
             Configuration configuration = new Configuration();
            //设置编码
             configuration.setDefaultEncoding("utf-8");
            //ftl模板文件
             configuration.setClassForTemplateLoading(this.getClass(), "/templates");
            //获取模板
             Template template = configuration.getTemplate("1.ftl");
             Map<String , Object> resultMap = new HashMap<>();
             List userInfoList = new ArrayList<>();
             userInfoList.add("2020");
             userInfoList.add("2021");
             userInfoList.add("2022");
             resultMap.put("userInfoList",userInfoList);
            //创建输出文件名
             File outFile = new File("UserInfoTest.doc");
             // 输出文件
             Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile),"UTF-8"));
             try {
                 //生成文件
                 template.process(resultMap,out);
                 out.flush();
                 out.close();
            } catch (TemplateException e) {
                 e.printStackTrace();
            }
        }
  • 插入图片


    private static String getImageStr(String imagepath) {
    InputStream in = null;
    byte[] data = null;
    try {
    in = new FileInputStream(imagepath);
    data = new byte[in.available()];
    in.read(data);
    in.close();
    BASE64Encoder encoder = new BASE64Encoder();
    return encoder.encode(data);
    } catch (IOException e) {
    System.out.println(e.getMessage());
    }
    return null;
    }

     

 

 

数据poi导入到excel表中
  • 了解

    • 用JavaPOI导出Excel时,我们会考虑到Excel版本及数据量的问题。针对不同的Excel版本,要采用不同的工具类。
      HSSFWorkbook:是操作Excel2003以前(包括2003)的版本,扩展名是.xls;
      XSSFWorkbook:是操作Excel2007的版本,扩展名是.xlsx;
      对于不同版本的EXCEL文档要使用不同的工具类,如果使用错了,会提示如下错误信息。
      org.apache.poi.openxml4j.exceptions.InvalidOperationException
      org.apache.poi.poifs.filesystem.OfficeXmlFileException
      从POI 3.8版本开始,提供了一种基于XSSF的低内存占用的API----SXSSF
      当数据量超出65536条后,在使用HSSFWorkbook或XSSFWorkbook,程序会报OutOfMemoryError:Javaheap space;内存溢出错误。这时应该用SXSSFworkbook。
    • 先创建一个工作簿,一个工作簿可以有多个工作表,一个工作表可以有多个行,一个行可以有多个单元格

        1. 根据excel文档对象,针对不同的execl类型分为HSSFWordbook(2003)和 XSSFWordbook(2007)

        1. Sheet : Excel的表单

        1. Row : Excel的行

        1. Cell : Excel的格子单元

        1. Font : Excel的字体

        1. CellStyle :格子单元的样式

    • 准备工作 加入POI依赖

       <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi</artifactId>
             <version>4.0.1</version>
         </dependency>
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml</artifactId>
             <version>4.0.1</version>
         </dependency>
         <dependency>
             <groupId>org.apache.poi</groupId>
             <artifactId>poi-ooxml-schemas</artifactId>
             <version>4.0.1</version>
         </dependency>
      • 创建Excel

        //测试创建excel文件
           @Test
           public  void main() throws Exception {
               //1.创建workbook工作簿
               Workbook wb = new XSSFWorkbook();
               //2.创建表单Sheet
               Sheet sheet = wb.createSheet("test");
               // 创建表单第二个表单
               Sheet sheet1 = wb.createSheet("test1");
               //3.文件流
               FileOutputStream fos = new FileOutputStream("test.xlsx");
               //4.写入文件
               wb.write(fos);
               fos.close();
          }
      • 创建单元格

         // 测试创建excel文件
           @Test
           public  void main() throws Exception {
               //1.创建workbook工作簿
               Workbook wb = new XSSFWorkbook();
               //2.创建表单Sheet
               Sheet sheet = wb.createSheet("test");
               //3.创建行对象,从0开始 这里是从第一行开始
               Row row = sheet.createRow(0);
               //4.创建单元格,从0开始 这里从第三列开始
               Cell cell = row.createCell(2);
               //5.单元格写入数据
               cell.setCellValue("传智播客");
               //3.文件流
               FileOutputStream fos = new FileOutputStream("test.xlsx");
               //4.写入文件
               wb.write(fos);
               fos.close();
          }
      • 设置格式

         // 测试创建excel文件
           @Test
           public  void main() throws Exception {
               //1.创建workbook工作簿
               Workbook wb = new XSSFWorkbook();
               //2.创建表单Sheet
               Sheet sheet = wb.createSheet("test");
               //3.创建行对象,从0开始 这里是从第一行开始
               Row row = sheet.createRow(0);
               //4.创建单元格,从0开始
               Cell cell = row.createCell(0);
               //创建单元格样式对象
               CellStyle cellStyle = wb.createCellStyle();
               //设置边框
               //下边框
               cellStyle.setBorderBottom(BorderStyle.DASH_DOT);
               //上边框
               cellStyle.setBorderTop(BorderStyle.HAIR);
               //设置字体
               //创建字体对象
               Font font = wb.createFont();
               //设置字体
               font.setFontName("华文行楷");
               //设置字号
               font.setFontHeightInPoints((short)28);
               cellStyle.setFont(font);
               //设置宽高
               //设置第一列的宽度是31个字符宽度
               sheet.setColumnWidth(0, 31 * 256);
               //设置行的高度是50个点
               row.setHeightInPoints(50);
               //设置居中显示
               //水平居中
               cellStyle.setAlignment(HorizontalAlignment.CENTER);
               //垂直居中
               cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
               //设置单元格样式
               cell.setCellStyle(cellStyle);
               //合并单元格
               CellRangeAddress region =new CellRangeAddress(0, 3, 0, 2);
               sheet.addMergedRegion(region);
               //5.单元格写入数据
               cell.setCellValue("王健好帅");
               //3.文件流
               FileOutputStream fos = new FileOutputStream("test.xlsx");
               //4.写入文件
               wb.write(fos);
               fos.close();
          }
      • 绘制图形

        //绘制图形
           public static void main(String[] args) throws Exception {
               //1.创建workbook工作簿
               Workbook wb = new XSSFWorkbook();
               //2.创建表单Sheet
               Sheet sheet = wb.createSheet("test");
               //读取图片流
               FileInputStream stream=new FileInputStream("e:\\logo.jpg");
               byte[] bytes= IOUtils.toByteArray(stream);
               //读取图片到二进制数组
               stream.read(bytes);
               //向Excel添加一张图片,并返回该图片在Excel中的图片集合中的下标
               int pictureIdx = wb.addPicture(bytes,Workbook.PICTURE_TYPE_JPEG);
               //绘图工具类
               CreationHelper helper = wb.getCreationHelper();
                //创建一个绘图对象
               Drawing<?> patriarch = sheet.createDrawingPatriarch();
               //创建锚点,设置图片坐标
               ClientAnchor anchor = helper.createClientAnchor();
               anchor.setCol1(0);//从0开始
               anchor.setRow1(0);//从0开始
               //创建图片
               Picture picture = patriarch.createPicture(anchor, pictureIdx);
               picture.resize();
               //6.文件流
               FileOutputStream fos = new FileOutputStream("E:\\test.xlsx");
               //7.写入文件
               wb.write(fos);
               fos.close();
          }
      • 加载Excel

        public class PoiTest06 {
           //单元格样式
           public static void main(String[] args) throws Exception {
               //1.创建workbook工作簿
               Workbook wb = new XSSFWorkbook("E:\\demo.xlsx");
               //2.获取sheet 从0开始
               Sheet sheet = wb.getSheetAt(0);
               int totalRowNum = sheet.getLastRowNum();
               Row row = null;
               Cell cell = null;
               //循环所有行
               for (int rowNum = 3; rowNum <sheet.getLastRowNum(); rowNum++) {
                   row = sheet.getRow(rowNum);
                   StringBuilder sb = new StringBuilder();
                   //循环每行中的所有单元格
                   for(int cellNum = 2; cellNum < row.getLastCellNum();cellNum++) {
                       cell = row.getCell(cellNum);
                       sb.append(getValue(cell)).append("-");
                  }
                   System.out.println(sb.toString());
              }
          }
           //获取数据
           private static Object getValue(Cell cell) {
               Object value = null;
               switch (cell.getCellType()) {
                   case STRING: //字符串类型
                       value = cell.getStringCellValue();
                       break;
                        case BOOLEAN: //boolean类型
                       value = cell.getBooleanCellValue();
                       break;
                   case NUMERIC: //数字类型(包含日期和普通数字)
                       if(DateUtil.isCellDateFormatted(cell)) {
                           value = cell.getDateCellValue();
                      }else{
                           value = cell.getNumericCellValue();
                      }
                       break;
                   case FORMULA: //公式类型
                       value = cell.getCellFormula();
                       break;
                   default:
                       break;
              }
               return value;
          }
        }
      •  

posted on 2021-02-04 10:22  紫玉坏小子  阅读(214)  评论(0编辑  收藏  举报