精华内容
下载资源
问答
  • 在工作中经常用到会有一些生成统计报告、请假等word的功能需求,小编之前做了一些报表的生成,使用过freemarker和poi,但是使用freemarker生成word有一些麻烦的点: 需要先将模板word转化为xml,而且在模板word中写...

    先给大家一个效果图:

    左侧是word模板,右侧是生成后的word文档。

     

    在工作中经常用到会有一些生成统计报告、请假等word的功能需求,小编之前做了一些报表的生成,使用过freemarker和poi,但是使用freemarker生成word有一些麻烦的点:

    1. 需要先将模板word转化为xml,而且在模板word中写好的占位符${obj}也会在转化为xml后被拆分开,还需要人工处理一次
    2. 在表格循环的时候,需要使用freemarker的<#list list as item>标签进行遍历
    3. 统计图表(饼图、折线图、柱状图等),图片适配度地,操作麻烦,图表需要人工修改大量xml中的标签已达到动态修改图表数据的效果,而word转为xml时,图片是已base64进行存储,在模板替换中我们需要将图片的base64码替换为占位符

    这就意味着使用freemarker需要我们预先编写好word模板再转化为xml,再对xml进行freemaker的标签、占位符等的处理后才能进行word生成,而且图表支持度很低。

    这里小编使用easypoi+jfree的形式进行word生成,使用jfree生成统计图表(饼图、折线图、柱状图等)图片,使用easypoi进行占位符替换、表格循环、图片插入已达到根据word模板生成word的效果。通过这个方式生成word只需要预先编写好word模板就可以进行word生成。

    但这个解决方案有一种缺点就是只支持07以后的word,也就是后缀为.docx的word文档。

    下面我就以Spring Boot项目为例举一个例子:

    开发工具:IntelliJ IDEA

    JDK:1.8

    以及项目目录结构:

    1、添加依赖:

            <dependency>
    			<groupId>cn.afterturn</groupId>
    			<artifactId>easypoi-base</artifactId>
    			<version>4.1.0</version>
    		</dependency>
    		<dependency>
    			<groupId>org.jfree</groupId>
    			<artifactId>jcommon</artifactId>
    			<version>1.0.24</version>
    		</dependency>
    		<dependency>
    			<groupId>org.jfree</groupId>
    			<artifactId>jfreechart</artifactId>
    			<version>1.5.0</version>
    		</dependency>

    2、编写jfreeutil工具类

    作为例子,我只封装了将图片转为字节数组和根据具有生成饼状图Image实体的两个方法,各位自行参考

    import cn.afterturn.easypoi.entity.ImageEntity;
    import lombok.extern.slf4j.Slf4j;
    import org.jfree.chart.ChartFactory;
    import org.jfree.chart.ChartUtils;
    import org.jfree.chart.JFreeChart;
    import org.jfree.chart.StandardChartTheme;
    import org.jfree.chart.labels.StandardPieSectionLabelGenerator;
    import org.jfree.chart.plot.PiePlot;
    import org.jfree.data.general.DefaultPieDataset;
    import org.springframework.util.Assert;
    import java.awt.*;
    import java.io.*;
    import java.util.Map;
    
    /**
     * @author 何昌杰
     *
     * 参考API博客 https://blog.csdn.net/dagecao/article/details/86536680
     */
    @Slf4j
    public class JfreeUtil {
    
        private static String tempImgPath="D:\\tempJfree.jpeg";
    
        /**
         * 将图片转化为字节数组
         * @return 字节数组
         */
        private static byte[] imgToByte(){
            File file = new File(tempImgPath);
            byte[] buffer = null;
            try {
                FileInputStream fis = new FileInputStream(file);
                ByteArrayOutputStream bos = new ByteArrayOutputStream(1000);
                byte[] b = new byte[1000];
                int n;
                while ((n = fis.read(b)) != -1) {
                    bos.write(b, 0, n);
                }
                fis.close();
                bos.close();
                buffer = bos.toByteArray();
            } catch (IOException e) {
                log.error(e.getMessage());
            }
            //删除临时文件
            file.delete();
            return buffer;
        }
    
        public static ImageEntity pieChart(String title, Map<String, Integer> datas, int width, int height) {
    
            //创建主题样式
            StandardChartTheme standardChartTheme = new StandardChartTheme("CN");
            //设置标题字体
            standardChartTheme.setExtraLargeFont(new Font("宋体", Font.BOLD, 20));
            //设置图例的字体
            standardChartTheme.setRegularFont(new Font("宋体", Font.PLAIN, 15));
            //设置轴向的字体
            standardChartTheme.setLargeFont(new Font("宋体", Font.PLAIN, 15));
            //设置主题样式
            ChartFactory.setChartTheme(standardChartTheme);
    
            //根据jfree生成一个本地饼状图
            DefaultPieDataset pds = new DefaultPieDataset();
            datas.forEach(pds::setValue);
            //图标标题、数据集合、是否显示图例标识、是否显示tooltips、是否支持超链接
            JFreeChart chart = ChartFactory.createPieChart(title, pds, true, false, false);
            //设置抗锯齿
            chart.setTextAntiAlias(false);
            PiePlot plot = (PiePlot) chart.getPlot();
            plot.setNoDataMessage("暂无数据");
            //忽略无值的分类
            plot.setIgnoreNullValues(true);
            plot.setBackgroundAlpha(0f);
            //设置标签阴影颜色
            plot.setShadowPaint(new Color(255,255,255));
            //设置标签生成器(默认{0})
            plot.setLabelGenerator(new StandardPieSectionLabelGenerator("{0}({1})/{2}"));
            try {
                ChartUtils.saveChartAsJPEG(new File(tempImgPath), chart, width, height);
            } catch (IOException e1) {
                log.error("生成饼状图失败!");
            }
            ImageEntity imageEntity = new ImageEntity(imgToByte(), width, height);
            Assert.notNull(imageEntity.getData(),"生成饼状图对象失败!");
            return imageEntity;
        }
    }

    关于jfree的一些API接口,和图形图表属性设置各位可参考这篇博客

    注:@Slf4j注解需要添加lombok的依赖

    3、编写wordutil工具类

    import cn.afterturn.easypoi.word.WordExportUtil;
    import org.apache.poi.xwpf.usermodel.XWPFDocument;
    import org.springframework.util.Assert;
    import java.io.File;
    import java.io.FileOutputStream;
    import java.util.Map;
    
    /**
     * @author 何昌杰
     */
    public class WordUtil {
        /**
         * 导出word
         * <p>第一步生成替换后的word文件,只支持docx</p>
         * <p>第二步下载生成的文件</p>
         * <p>第三步删除生成的临时文件</p>
         * 模版变量中变量格式:{{foo}}
         *
         * @param templatePath word模板地址
         * @param temDir       生成临时文件存放地址
         * @param fileName     文件名
         * @param params       替换的参数
         */
        public static void exportWord(String templatePath, String temDir, String fileName, Map<String, Object> params) {
            Assert.notNull(templatePath, "模板路径不能为空");
            Assert.notNull(temDir, "临时文件路径不能为空");
            Assert.notNull(fileName, "导出文件名不能为空");
            Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式");
            if (!temDir.endsWith("/")) {
                temDir = temDir + File.separator;
            }
            File dir = new File(temDir);
            if (!dir.exists()) {
                dir.mkdirs();
            }
            try {
                XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
                String tmpPath = temDir + fileName;
                FileOutputStream fos = new FileOutputStream(tmpPath);
                doc.write(fos);
                fos.flush();
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    4、编写word模板

    关于word中的更多表达式各位可参考easypoi文档的3节内容。

    5、编写测试类

    import java.util.ArrayList;
    import java.util.HashMap;
    import cn.afterturn.easypoi.entity.ImageEntity;
    import com.springclouddemo.freemarkerdemo.utils.JfreeUtil;
    import com.springclouddemo.freemarkerdemo.utils.WordUtil;
    
    /**
     * @author 何昌杰
     */
    public class WordDemo1 {
    
        public static void main(String[] args) {
            HashMap<String, Object> map = new HashMap<>(4);
    
            //模拟饼状图数据
            HashMap<String, Integer> datas = new HashMap<>(3);
            datas.put("一号",10);
            datas.put("二号",20);
            datas.put("三号",40);
            ImageEntity imageEntity = JfreeUtil.pieChart("测试",datas, 500, 300);
             map.put("picture", imageEntity);
    
            //模拟其它普通数据
            map.put("username", "张三");
            map.put("date", "2019-10-10");
            map.put("desc", "测试");
            map.put("boo", true);
    
            //模拟表格数据
            ArrayList<HashMap<String, String>> list = new ArrayList<>(2);
            HashMap<String, String> temp = new HashMap<>(3);
            temp.put("sn","1");
            temp.put("name","第一个人");
            temp.put("age","23");
            list.add(temp);
            temp = new HashMap<>(3);
            temp.put("sn","2");
            temp.put("name","第二个人");
            temp.put("age","24");
            list.add(temp);
            map.put("personlist",list);
            //word模板相对路径、word生成路径、word生成的文件名称、数据源
            WordUtil.exportWord("template/demo1.docx", "D:/", "生成文件.docx", map);
        }
    }

    6、运行测试

    生成后的word文档

    展开全文
  • poi实现操作生成word表格和操作word中的图表数据 最近因为有根据数据操作文档的需求,所以使用poi来实现了功能

    最近因为有根据数据操作文档的需求,所以使用poi来实现了功能
    其实有好几种方式来实现这一系列对office操作的需求,可供选择的有easypoi,poi-tl (poi-tl
    对于poi,有一个博主已经开发的很完善并将代码提到了开源平台上poi操作

    写入word表格

    1.1首先要将写入的数据整理好,将其封装在一个类中:

    import java.math.BigInteger;
    import java.text.ParseException;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Calendar;
    import java.util.Date;
    import java.util.List;
    
    
    public class GetElsxInfoAction{
        private Date exportStartTime;
    
        private Date exportEndTime;
    
        private String dredgeTime = "2021-07-19 00:00:00";
    
        private ExportInfoToWord exportInfoToWord;
        
        private String myDeptId = "";
    
        public void execute() throws Exception {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String endTime = sdf.format(exportEndTime);
            String startTime = sdf.format(exportStartTime);
    
            String[] staticsticName = {"总人数", "今日人数", "总登录人数", "今日登录人数",
                    "其他登录人数"};
            String[] deptUserNumsName = null;
            String[] postsNumsName = null;
    
            List<String> list = new ArrayList<>();
            List<String> deptUserNumsList = new ArrayList<>();
            List<String> postsNumsList = new ArrayList<>();
    
            List<GatewayBucketsModel> gatewayBuckets = new ArrayList<>();
    
            //总开通人数
            BigInteger allRegistCount = (BigInteger) getAllRegistCount().get(0);
    
            //今日开通人数
            BigInteger todayRegistCount = (BigInteger) getTodayRegistCount(startTime, endTime).get(0);
    
            list.add(String.valueOf(allRegistCount));
            list.add(String.valueOf(todayRegistCount));
    
            //总登录人数
            BigInteger currentDayVisitedCount = (BigInteger) getUsersTotal(dredgeTime).get(0);
            list.add(String.valueOf(currentDayVisitedCount));
    
            //今日总登录人数
            BigInteger allDayVisitedCount = (BigInteger) getUsersByFuncId(startTime, endTime).get(0);
            list.add(String.valueOf(allDayVisitedCount));
    
            //获取今日其他人数
            List todayOtherDeptNums = getTodayOtherDeptNums(startTime, endTime, myDeptId);
            if (ListUtil.isLstEmpty(todayOtherDeptNums)) {
                list.add("0");
            } else {
                list.add(todayOtherDeptNums.size() + "");
            }
    
            //今日登录分布情况
            List deptList = getDeptUserNumsList(startTime, endTime);
    
            if (!ListUtil.isLstEmpty(deptList)) {
                deptUserNumsName = new String[deptList.size()];
                for (int i = 0; i < deptList.size(); i++) {
                    Object[] result = (Object[]) deptList.get(i);
                    String deptName = (String) result[1];
                    String userNum = String.valueOf(result[2]);
                    deptUserNumsName[i] = deptName;
                    deptUserNumsList.add(userNum);
                }
            }
    
            ExportWordMode exportWordMode = new ExportWordMode();
            exportWordMode.setStaticsticName(staticsticName);
            exportWordMode.setList(list);
            exportWordMode.setSmsgcenterFailNum(null);
            exportWordMode.setGatewayBuckets(gatewayBuckets);
            exportWordMode.setDeptUserNumsName(deptUserNumsName);
            exportWordMode.setDeptUserNumsList(deptUserNumsList);
            exportWordMode.setPostsNumsName(postsNumsName);
            exportWordMode.setPostsNumsList(postsNumsList);
    
            exportInfoToWord = new ExportInfoToWord();
            exportInfoToWord.exportWord(exportWordMode, exportStartTime, exportEndTime);
        }
    
        /**
         * 计算减去x天的时间
         *
         * @param date 时间
         * @param days 相减的天数
         * @return
         */
        public static Date subDayTime(Date date, Integer days) {
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
            calendar.add(Calendar.SECOND, -days * 24 * 3600);
            return calendar.getTime();
        }
    
        private void addPeakInfoToList(List<String> list, List peak, int i) {
            StringBuffer sb = new StringBuffer();
            Object[] o = (Object[]) peak.get(i);
            String time = ((String) o[0]).replace("\"", "");
            sb.append(String.format("%02d", Integer.parseInt(time))).append("时").append("--").append(String.format("%02d", Integer.parseInt(time) + 1)).append("时").append(": ").append(String.valueOf((BigInteger) o[1]).replaceAll("\"", "")).append("人");
            list.add(sb.toString());
        }
    }
    
    

    1.2 其次将数据写入word,写成表格

    import java.io.*;
    import java.text.SimpleDateFormat;
    import java.util.Comparator;
    import java.util.Date;
    import java.util.List;
    
    public class ExportInfoToWord {
    
        /**
         * 这里定义的变量是对应的表格中的键和值
         */
        private String[] staticsticName;
        private String[] staticsName2;
        private String[] postNames;
        private List<String> list;
        private List<String> list2;
        private List<String> postsNums;
    
        public void exportWord(ExportWordMode exportWordMode, Date exportStartTime, Date exportEndTime) {
    
            staticsticName = exportWordMode.getStaticsticName();
            list = exportWordMode.getList();
    
            staticsName2 = exportWordMode.getDeptUserNumsName();
            list2 = exportWordMode.getDeptUserNumsList();
    
            postNames = exportWordMode.getPostsNumsName();
            postsNums = exportWordMode.getPostsNumsList();
            // 文档生成方法
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH时mm分");
            String fileName;
            fileName = sdf.format(exportStartTime) + "--" + sdf.format(exportEndTime);
            XWPFDocument doc = new XWPFDocument();
    
    
            XWPFHelper.addCustomHeadingStyle(doc, "heading 1", 0);
            XWPFHelper.addCustomHeadingStyle(doc, "heading 2", 1);
            XWPFHelper.addCustomHeadingStyle(doc, "heading 3", 2);
    
    
            XWPFParagraph p1 = doc.createParagraph(); // 创建段落
            p1.setAlignment(ParagraphAlignment.CENTER);//样式居中
            XWPFRun r1 = p1.createRun(); // 创建段落文本
            r1.setText("文件名"); // 设置文本
            r1.setBold(true);
            r1.setFontSize(20);
            r1.addBreak();
            XWPFParagraph second = doc.createParagraph(); // 创建段落
            second.setAlignment(ParagraphAlignment.CENTER);//样式居中
            XWPFRun secondr2 = second.createRun(); // 创建段落文本
    
            secondr2.setText(sdf.format(exportStartTime) + "--" + sdf.format(exportEndTime)); // 设置文本
    
            FileOutputStream out = null; // 创建输出流
            try {
                // 向word文档中添加内容
                XWPFHelper.createParagraph(doc, "1、总体情况", "heading 1", true);
                XWPFTable generalConditionTable = XWPFHelperTable.createTable(doc, list.size()+1, 3, "generalConditionTable");
                XWPFHelperTable.setTableCellStyle(generalConditionTable);
                XWPFHelperTable.setTableWidthAndHAlign(generalConditionTable, "9070", STJc.CENTER);
                // 获取到刚刚插入的行
                XWPFTableRow row1 = generalConditionTable.getRow(0);
                XWPFHelperTable.setFirstTableRowColor(row1, 3, "E7E6E6");
                // 设置第一行单元格内容
                XWPFParagraph serial = row1.getCell(0).getParagraphs().get(0);
                XWPFHelperTable.setTableCellParagraphContent(serial, "序号", ParagraphAlignment.CENTER);
                XWPFParagraph statisContent = row1.getCell(1).getParagraphs().get(0);
                XWPFHelperTable.setTableCellParagraphContent(statisContent, "统计内容", ParagraphAlignment.CENTER);
                XWPFParagraph data = row1.getCell(2).getParagraphs().get(0);
                XWPFHelperTable.setTableCellParagraphContent(data, "数据", ParagraphAlignment.CENTER);
    
                // 插入内容
                XWPFHelperTable.setTableContent(generalConditionTable, staticsticName, list);
    
                doc.setTable(0, generalConditionTable);
    
                //插入第二个表格
                XWPFHelper.createParagraph(doc, "2、人员分布情况", "heading 1", true);
                XWPFTable secondTable = XWPFHelperTable.createTable(doc, list2.size() + 1, 3, "secondTable");
                XWPFHelperTable.setTableCellStyle(secondTable);
                XWPFHelperTable.setTableWidthAndHAlign(secondTable, "9070", STJc.CENTER);
                //获取到刚刚插入的行
                XWPFTableRow row2 = secondTable.getRow(0);
                XWPFHelperTable.setFirstTableRowColor(row2, 3, "E7E6E6");
                //设置第一行单元格内容
                XWPFParagraph serial2 = row2.getCell(0).getParagraphs().get(0);
                XWPFHelperTable.setTableCellParagraphContent(serial2, "序号", ParagraphAlignment.CENTER);
                XWPFParagraph staticsContent2 = row2.getCell(1).getParagraphs().get(0);
                XWPFHelperTable.setTableCellParagraphContent(staticsContent2, "部门名称", ParagraphAlignment.CENTER);
                XWPFParagraph data2 = row2.getCell(2).getParagraphs().get(0);
                XWPFHelperTable.setTableCellParagraphContent(data2, "登录人数", ParagraphAlignment.CENTER);
                //插入内容
                XWPFHelperTable.setTableContent(secondTable,staticsName2,list2);
                doc.setTable(1, secondTable);
    
                //插入第三个表格
                XWPFHelper.createParagraph(doc, "3、其他情况", "heading 1", true);
                XWPFTable thirdTable = XWPFHelperTable.createTable(doc, postsNums.size() + 1, 3, "thirdTable");
                XWPFHelperTable.setTableCellStyle(thirdTable);
                XWPFHelperTable.setTableWidthAndHAlign(thirdTable, "9070", STJc.CENTER);
                //获取到刚刚插入的行
                XWPFTableRow row3 = thirdTable.getRow(0);
                XWPFHelperTable.setFirstTableRowColor(row3, 3, "E7E6E6");
                //设置第一行单元格内容
                XWPFParagraph serial3 = row3.getCell(0).getParagraphs().get(0);
                XWPFHelperTable.setTableCellParagraphContent(serial3, "序号", ParagraphAlignment.CENTER);
                XWPFParagraph staticsContent3 = row3.getCell(1).getParagraphs().get(0);
                XWPFHelperTable.setTableCellParagraphContent(staticsContent3, "统计内容", ParagraphAlignment.CENTER);
                XWPFParagraph data3 = row3.getCell(2).getParagraphs().get(0);
                XWPFHelperTable.setTableCellParagraphContent(data3, "数据", ParagraphAlignment.CENTER);
                //插入内容
                XWPFHelperTable.setTableContent(thirdTable,postNames,postsNums);
                doc.setTable(2, thirdTable);
    
    
                setStreamFile(fileName, doc);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (out != null) {
                    try {
                        out.close();
                    } catch (IOException e) {
    
                        e.printStackTrace();
                    }
                }
            }
        }
    
        private static void setStreamFile(String fileName, XWPFDocument doc) {
            fileName = "文件名("+fileName+").docx";
            FileOutputStream fout = null;
            String path = getClassLoader().getResource("").getPath();
            try {
                fout = new FileOutputStream(new File(path, fileName));
                doc.write(fout);
                fout.flush();
                InputStream in = new FileInputStream(new File(path, fileName));
                File newFile = new File(fileName);
                FileUtils.copyInputStreamToFile(in, newFile);
                SlwContext.setStreamData(new StreamData(newFile, StreamData.MOD_DOWNLOAD, fileName));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    
    

    2 在word表格中动态修改图表(柱状图)数据

    2.1 同样先整理数据

    	public static Map<String, String> getWeekDate() {
            Map<String, String> map = new HashMap();
            Calendar cal = Calendar.getInstance();
            // 设置一个星期的第一天,按中国的习惯一个星期的第一天是星期一
            cal.setFirstDayOfWeek(Calendar.MONDAY);
            // 获得当前日期是一个星期的第几天
            int dayWeek = cal.get(Calendar.DAY_OF_WEEK);
            if (dayWeek == 1) {
                dayWeek = 8;
            }
    
            cal.add(Calendar.DATE, cal.getFirstDayOfWeek() - dayWeek);// 根据日历的规则,给当前日期减去星期几与一个星期第一天的差值
            Date mondayDate = cal.getTime();
            String weekBegin = sdf.format(mondayDate);
    
            cal.add(Calendar.DATE, 4 + cal.getFirstDayOfWeek());
            Date sundayDate = cal.getTime();
            String weekEnd = sdf.format(sundayDate);
    
            map.put("mondayDate", weekBegin + " 00:00:00");//2021-08-05
            map.put("sundayDate", weekEnd + " 23:59:59");
    
            map.put("mondayTime", sdf2.format(mondayDate));//2021年08月05日
            map.put("sundayTime", sdf2.format(sundayDate));
            return map;
        }
        
    	private static void export() {
            /*
             * 创建一个Map对象,将Word文档需要的数据都保存到该Map对象中
             */
            Map<String, Object> dataMap = new HashMap<>();
    
    
            Map<String, String> weekDate = getWeekDate();
            String mondayDate = weekDate.get("mondayDate");//周一
            name += mondayDate.substring(0, 10).replace("-", "");//文档名称+日期
            String sundayDate = weekDate.get("sundayDate");//周日
            String mondayTime = weekDate.get("mondayTime");//年月日格式
            String sundayTime = weekDate.get("sundayTime");//年月日格式
            String time = mondayTime + "—" + sundayTime;
            dataMap.put("exportTime", time);
    		//中间数据省略,根据自己最后要读取的excel来设置
            System.out.println("导出成功!");
            return;
        }
    

    2.2 将数据写入excel

    public class PoiToExcel {
        public static void toExcel(List<List<String>> statistics, String path) {
            XSSFWorkbook wb = null;//创建XSSFWorkbook对象,针对xlsx使用XSSFWorkbook
            try {
                wb = new XSSFWorkbook(new FileInputStream(path));
            } catch (IOException e) {
                e.printStackTrace();
            }
            XSSFSheet sheet1 = null;
            if (wb != null) {
                sheet1 = wb.getSheet("Sheet1");
            }else {
                System.out.println("未找到sheet");
                System.exit(0);
            }
    
            //写一个循环根据数据的数量来创建表格
            for (int i = 0; i < statistics.size(); i++) {
                if (i == 0) {
                    continue;
                }
                //为了使excel保留之前格式,这里选择了替换数据的方式
                XSSFRow row = null;
                //sheet.getLastRowNum()
                if (i < sheet1.getPhysicalNumberOfRows()) {
                    row = sheet1.getRow(i);
    
                    for (int j = 0; j < statistics.get(i).size(); j++) {
                        if (j != 0) {
                            row.getCell(j).setCellValue(Integer.parseInt(statistics.get(i).get(j)));
                        } else {
                            row.getCell(j).setCellValue(String.valueOf(statistics.get(i).get(j)));
                        }
                    }
                }else {
                    row = sheet1.createRow(i);
                    for (int j = 0; j < statistics.get(i).size(); j++) {
                        if(i != 0 && j!= 0){
                            row.createCell(j).setCellValue(Integer.parseInt(statistics.get(i).get(j)));
                        } else {
                            row.createCell(j).setCellValue(String.valueOf(statistics.get(i).get(j)));
                        }
                    }
                }
    
    
            }
    
            //输出Excel文件
    
            OutputStream output = null;
            try {
                output = new FileOutputStream(path);
    
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
    
            try {
                wb.write(output);
                output.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    
        public static void main(String[] args) {
            List<List<String>> statistics = new ArrayList<>();
            statistics.add(Arrays.asList("XXX", "8"));
            statistics.add(Arrays.asList("XXXXX", "100"));
    
    
            toExcel(statistics, "C:\\poi-demo\\src\\main\\output\\result.xlxs");
        }
    }
    
    
    展开全文
  • PHP生成WORD表格

    2021-05-06 04:02:08
    好文网为大家准备了关于PHP生成WORD表格的文章,好文网里面收集了五十多篇关于好PHP生成WORD表格好文,希望可以帮助大家。更多关于PHP生成WORD表格内容请关注好文网。ctrl+D请收藏!篇一:PHP导出Word文档原理好文网为...

    好文网为大家准备了关于PHP生成WORD表格的文章,好文网里面收集了五十多篇关于好PHP生成WORD表格好文,希望可以帮助大家。更多关于PHP生成WORD表格内容请关注好文网。ctrl+D请收藏!篇一:PHP导出Word文档原理

    好文网为大家准备了关于PHP动态生成表格范文,好文网里面收集了五十多篇关于好PHP动态生成表格好文,希望可以帮助大家。更多关于PHP动态生成表格内容请关注好文网篇一:PHP生成静态网页的通用代码最近研究PHP的一些开发技术,发现

    好文网为大家准备了关于PHP生成ECEL表格范文,好文网里面收集了五十多篇关于好PHP生成ECEL表格好文,希望可以帮助大家。更多关于PHP生成ECEL表格内容请关注好文网篇一:Php生成Excel文件如此简单最近因项目需要,需

    好文网为大家准备了关于PHP表格生成的文章,好文网里面收集了五十多篇关于好PHP表格生成好文,希望可以帮助大家。更多关于PHP表格生成内容请关注好文网。ctrl+D请收藏!篇一:PHP导出Excel表格PHP导出Excel表格,

    好文网为大家准备了关于PHP表格生成图片范文,好文网里面收集了五十多篇关于好PHP表格生成图片好文,希望可以帮助大家。更多关于PHP表格生成图片内容请关注好文网篇一:php导出excel表格最近因项目需要,需要开发一个模块,把系

    好文网为大家准备了关于PHP导出WORD表格的文章,好文网里面收集了五十多篇关于好PHP导出WORD表格好文,希望可以帮助大家。更多关于PHP导出WORD表格内容请关注好文网。ctrl+D请收藏!篇一:PHP操作Word文档如何

    好文网为大家准备了关于WORD怎么生成表格范文,好文网里面收集了五十多篇关于好WORD怎么生成表格好文,希望可以帮助大家。更多关于WORD怎么生成表格内容请关注好文网篇一:如何用word制作表格我们可以用图一所示的三种方式来打开

    好文网为大家准备了关于WORD文字生成表格范文,好文网里面收集了五十多篇关于好WORD文字生成表格好文,希望可以帮助大家。更多关于WORD文字生成表格内容请关注好文网篇一:Word2010中怎样将文字转换成表格Word2010中

    好文网为大家准备了关于WORD表格生成表头的文章,好文网里面收集了五十多篇关于好WORD表格生成表头好文,希望可以帮助大家。更多关于WORD表格生成表头内容请关注好文网。ctrl+D请收藏!篇一:让Word表格标题行重复在每页自

    好文网为大家准备了关于WORD表格自动生成表头的文章,好文网里面收集了五十多篇关于好WORD表格自动生成表头好文,希望可以帮助大家。更多关于WORD表格自动生成表头内容请关注好文网。ctrl+D请收藏!篇一:word表格每页都有

    好文网为大家准备了关于在WORD中如何生成表格目录的文章,好文网里面收集了五十多篇关于好在WORD中如何生成表格目录好文,希望可以帮助大家。更多关于在WORD中如何生成表格目录内容请关注好文网。ctrl+D请收藏!篇一:Word

    好文网为大家准备了关于WORD中的表格怎么生成目录范文,好文网里面收集了五十多篇关于好WORD中的表格怎么生成目录好文,希望可以帮助大家。更多关于WORD中的表格怎么生成目录内容请关注好文网篇一:在word中如何自动生成图表目录

    好文网为大家准备了关于WORD如何用表格生成统计表的文章,好文网里面收集了五十多篇关于好WORD如何用表格生成统计表好文,希望可以帮助大家。更多关于WORD如何用表格生成统计表内容请关注好文网。ctrl+D请收藏!篇一:教你如何

    好文网为大家准备了关于WORD如何将表格生成图表范文,好文网里面收集了五十多篇关于好WORD如何将表格生成图表好文,希望可以帮助大家。更多关于WORD如何将表格生成图表内容请关注好文网篇一:word2003自动生成参考文献和图表

    好文网为大家准备了关于WORD如何生成带表格的模板范文,好文网里面收集了五十多篇关于好WORD如何生成带表格的模板好文,希望可以帮助大家。更多关于WORD如何生成带表格的模板内容请关注好文网篇一:word表格模板湖南工程学院学生

    好文网为大家准备了关于WORD希望生成的目录放在表格里的文章,好文网里面收集了五十多篇关于好WORD希望生成的目录放在表格里好文,希望可以帮助大家。更多关于WORD希望生成的目录放在表格里内容请关注好文网。ctrl+D请收藏!篇

    好文网为大家准备了关于PHP表格制作的文章,好文网里面收集了五十多篇关于好PHP表格制作好文,希望可以帮助大家。更多关于PHP表格制作内容请关注好文网。ctrl+D请收藏!篇一:使用PHP和jQuery制作分页和表格使用PHP和

    好文网为大家准备了关于PHP上传表格的文章,好文网里面收集了五十多篇关于好PHP上传表格好文,希望可以帮助大家。更多关于PHP上传表格内容请关注好文网。ctrl+D请收藏!篇一:php文件上传后缀名与文件类型对照表(几乎涵盖所有

    好文网为大家准备了关于WORD如何用表格生成统计表的文章,好文网里面收集了五十多篇关于好WORD如何用表格生成统计表好文,希望可以帮助大家。更多关于WORD如何用表格生成统计表内容请关注好文网。ctrl+D请收藏!篇一:教你如何

    好文网为大家准备了关于WORD如何将表格生成图表范文,好文网里面收集了五十多篇关于好WORD如何将表格生成图表好文,希望可以帮助大家。更多关于WORD如何将表格生成图表内容请关注好文网篇一:word2003自动生成参考文献和图表

    好文网为大家准备了关于WORD如何生成带表格的模板范文,好文网里面收集了五十多篇关于好WORD如何生成带表格的模板好文,希望可以帮助大家。更多关于WORD如何生成带表格的模板内容请关注好文网篇一:word表格模板湖南工程学院学生

    好文网为大家准备了关于WORD希望生成的目录放在表格里的文章,好文网里面收集了五十多篇关于好WORD希望生成的目录放在表格里好文,希望可以帮助大家。更多关于WORD希望生成的目录放在表格里内容请关注好文网。ctrl+D请收藏!篇

    好文网为大家准备了关于PHP表格制作的文章,好文网里面收集了五十多篇关于好PHP表格制作好文,希望可以帮助大家。更多关于PHP表格制作内容请关注好文网。ctrl+D请收藏!篇一:使用PHP和jQuery制作分页和表格使用PHP和

    好文网为大家准备了关于PHP上传表格的文章,好文网里面收集了五十多篇关于好PHP上传表格好文,希望可以帮助大家。更多关于PHP上传表格内容请关注好文网。ctrl+D请收藏!篇一:php文件上传后缀名与文件类型对照表(几乎涵盖所有

    好文网为大家准备了关于PHP表格展示范文,好文网里面收集了五十多篇关于好PHP表格展示好文,希望可以帮助大家。更多关于PHP表格展示内容请关注好文网篇一:PHP动态创建MYSQL数据表实例PHP动态创建MYSQL数据表实例文件1

    好文网为大家准备了关于PHP表格选中范文,好文网里面收集了五十多篇关于好PHP表格选中好文,希望可以帮助大家。更多关于PHP表格选中内容请关注好文网篇一:php表单选择Php中表单的选择传递问题单选:1,

    好文网为大家准备了关于PHP分页表格的文章,好文网里面收集了五十多篇关于好PHP分页表格好文,希望可以帮助大家。更多关于PHP分页表格内容请关注好文网。ctrl+D请收藏!篇一:使用PHP和jQuery制作分页和表格使用PHP和

    好文网为大家准备了关于PHP表格下一周的文章,好文网里面收集了五十多篇关于好PHP表格下一周好文,希望可以帮助大家。更多关于PHP表格下一周内容请关注好文网。ctrl+D请收藏!篇一:PHP表格删除语句publicfunctio

    好文网为大家准备了关于PHP表格导出ECEL的文章,好文网里面收集了五十多篇关于好PHP表格导出ECEL好文,希望可以帮助大家。更多关于PHP表格导出ECEL内容请关注好文网。ctrl+D请收藏!篇一:PHP导出Excel表格P

    好文网为大家准备了关于PHP下载表格文件的文章,好文网里面收集了五十多篇关于好PHP下载表格文件好文,希望可以帮助大家。更多关于PHP下载表格文件内容请关注好文网。ctrl+D请收藏!篇一:php导入excel文件的处理php导

    好文网为大家准备了关于PHP取表格内容的文章,好文网里面收集了五十多篇关于好PHP取表格内容好文,希望可以帮助大家。更多关于PHP取表格内容内容请关注好文网。ctrl+D请收藏!篇一:提交表单后PHP获取提交内容的方法新版的PH

    好文网为大家准备了关于PHP输入表格的文章,好文网里面收集了五十多篇关于好PHP输入表格好文,希望可以帮助大家。更多关于PHP输入表格内容请关注好文网。ctrl+D请收藏!篇一:使用PHP和jQuery制作分页和表格使用PHP和

    好文网为大家准备了关于PHP下载ECEL表格范文,好文网里面收集了五十多篇关于好PHP下载ECEL表格好文,希望可以帮助大家。更多关于PHP下载ECEL表格内容请关注好文网篇一:Php生成Excel文件如此简单最近因项目需要,需

    好文网为大家准备了关于PHP表格颜色范文,好文网里面收集了五十多篇关于好PHP表格颜色好文,希望可以帮助大家。更多关于PHP表格颜色内容请关注好文网篇一:PHPWord使用指南By_StonePHPWord使用指南(PHPWor

    展开全文
  • 用java实现word统计报表和图形统计的导出
  • 一个围绕统计分析功能的系统,在最后制作统计分析时需要一个批量点击的功能,用以批量制作echarts图形后生成图片并保存图形和图片。方便后续导出。public class EchartsUtils {private static final String JSpath =...

    一个围绕统计分析功能的系统,在最后制作统计分析时需要一个批量点击的功能,用以批量制作echarts图形后生成图片并保存图形和图片。方便后续导出。

    public class EchartsUtils {

    private static final String JSpath = "C:\\echarts-convert\\echarts-convert1.js";

    public static void main(String[] args) {

    String imgName = "D:/平台/tes" + UUID.randomUUID().toString().substring(0, 4) + ".png ";

    String option = "{xAxis: {type: 'category',data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']},yAxis: {type: 'value'},series: [{data: [820, 932, 901, 934, 1290, 1330, 1320],type: 'line'}]}";

    //String options = "test";

    String base64Img = generateEChart(option,1600,900);

    System.out.println(base64Img);

    }

    public static String generateEChart(String options,int width,int height) {

    String fileName= "test-"+UUID.randomUUID().toString().substring(0, 8) + ".png";

    String imgPath = "D:/平台/img/" +fileName;

    String dataPath = writeFile(options);//数据json

    try {

    File file = new File(imgPath); //文件路径(路径+文件名)

    if (!file.exists()) { //文件不存在则创建文件,先创建目录

    File dir = new File(file.getParent());

    dir.mkdirs();

    file.createNewFile();

    }

    String cmd = "phantomjs " + JSpath + " -infile " + dataPath + " -outfile " + imgPath + " -width " + width + " -height " + height;

    System.out.println(cmd);

    Process process = Runtime.getRuntime().exec(cmd);

    BufferedReader input = new BufferedReader(new InputStreamReader(process.getInputStream()));

    String line = "";

    while ((line = input.readLine()) != null) {

    //System.out.println(line);

    }

    input.close();

    } catch (IOException e) {

    e.printStackTrace();

    }finally{

    String base64Img = ImageToBase64(imgPath);

    //deleteFile(imgPath);

    //deleteFile(dataPath);

    return base64Img.replaceAll("\\s*", "");

    }

    }

    public static String writeFile(String options) {

    String dataPath="D:/平台/data/data"+ UUID.randomUUID().toString().substring(0, 8) +".json";

    try {

    /* 写入Txt文件 */

    File writename = new File(dataPath); // 相对路径,如果没有则要建立一个新的output.txt文件

    if (!writename.exists()) { //文件不存在则创建文件,先创建目录

    File dir = new File(writename.getParent());

    dir.mkdirs();

    writename.createNewFile(); // 创建新文件

    }

    BufferedWriter out = new BufferedWriter(new FileWriter(writename));

    out.write(options); // \r\n即为换行

    out.flush(); // 把缓存区内容压入文件

    out.close(); // 最后记得关闭文件

    } catch (IOException e) {

    e.printStackTrace();

    }

    return dataPath;

    }

    /**

    * 图片文件转为base64

    * @param imgPath

    */

    private static String ImageToBase64(String imgPath) {

    byte[] data = null;

    // 读取图片字节数组

    try {

    InputStream in = new FileInputStream(imgPath);

    data = new byte[in.available()];

    in.read(data);

    in.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    // 对字节数组Base64编码

    BASE64Encoder encoder = new BASE64Encoder();

    // 返回Base64编码过的字节数组字符串

    return encoder.encode(Objects.requireNonNull(data));

    }

    /**

    * 删除文件

    *

    * @param pathname

    * @return

    * @throws IOException

    */

    public static boolean deleteFile(String pathname){

    boolean result = false;

    File file = new File(pathname);

    if (file.exists()) {

    file.delete();

    result = true;

    System.out.println("文件已经被成功删除");

    }

    return result;

    }

    }

    因为是需要保存base64图片。所以在生成并读取完毕后将图片删除。

    附上图片转base64方法:

    /**

    * 图片文件转为base64

    * @param imgPath

    */

    private static String ImageToBase64(String imgPath) {

    byte[] data = null;

    // 读取图片字节数组

    try {

    InputStream in = new FileInputStream(imgPath);

    data = new byte[in.available()];

    in.read(data);

    in.close();

    } catch (IOException e) {

    e.printStackTrace();

    }

    // 对字节数组Base64编码

    BASE64Encoder encoder = new BASE64Encoder();

    // 返回Base64编码过的字节数组字符串

    return encoder.encode(Objects.requireNonNull(data));

    }

    转换后的编码没有头,需要在保存时手动添加“data:image/png;base64,”

    展开全文
  • 利用pychartdir库生成图表,保存图片,转成字节数据2.然后使用office办公软件编写所需要的模板word,另存为xml文件3.利用jinja2库渲染修改好的模板,然后写入.doc文件即可那下面我将我实现的过程记录给大家分享一下.....
  • 项目中用到生成word报表,报表中有表格的合并 、页眉、表格中会有报表图片。然后查找了网上的资料,利用echar生成柱状图,然后已base64串的方式发给后台,在后台解析成字节数组 ,利用poi生成word文档中。
  • 项目中多多少少会用到导出word这样便于导出后进行细微的手动修改。目前我没找到一款插件可以引入直接导出word、直接用最原始的方法poi导出word根据模板方法,这个导出需要用4.0以上版本才可以。 1、项目中引入依赖...
  • 写了一个月 4月20-5月20,终于完成 …一个日报 大多es查的数据,有一点mysql查的数据 先占个坑,回头有空记录一下
  • Excel多张表格数据自动汇总到一张表上方法?如何将excel多张数据汇总在一个表中分为以下几步:1、工作簿中有多张工作表,A列和B列都有类似的数据,行数不同。2、选中“汇总”表A1单元格,点击【数据】-【合并计算】...
  • POI报表Word导出

    2017-02-06 14:31:07
    POI报表Word导出
  • PHP表格生成图片

    2021-04-10 14:45:20
    好文网为大家准备了关于PHP表格生成图片范文,好文网里面收集了五十多篇关于好PHP表格生成图片好文,希望可以帮助大家。更多关于PHP表格生成图片内容请关注好文网篇一:php导出excel表格最近因项目需要,需要开发一个...
  • 通过Python程序读取Excel文件中的数据,生成图表,最好将生成图表生成至浏览器页面,后期数据多之后,也能自动缩放,而不会出现显示不全问题。 三、需求实现代码 # 调用本地echarts.min.js 文件 from pyecharts....
  • 一.导入freemaker和Echarts的jar包 ... 二.... 1.把需要替换的内容或图片用xxx替换...2.表格只需要画一行,循环在xml中配置 3.如果多张图片的话,一定要选择不同的图片,不能为了省事使用同一张图片! 4.模板画好...
  • 最近公司让我实现一个利用原有word模板,导出word文档的功能模块,发现docx4j是个很不错的工具,但是之前从来没有用过,对此并不了解,于是上网查找相关资料,也是非常少之,于是便自己开始摸索。1、原有word模板...
  • 公众号后台回复“图书“,了解更多号主新书内容 作者:林小呆 来源:数据分析与统计学之美 今日需求其实就是把Word中的表格转到Excel中,顺便做一个调整。这个需求在实际工作中,很多人...
  • 我现在的问题是能导出文字和表格 不知道怎么导出统计图,求大神帮忙解答我的这个问题
  • 一、制作.ftl后缀的word模板文件 1、新建一个word文档模板 &amp;amp;amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;amp;amp;nbsp; &amp;amp;amp;amp;amp;amp;nbsp;&...
  • 简单好用的Word技巧一秒对齐文字在Word中如何对齐文字,我想十个人中有九个都会像三顿这样手打空格。只有短短几行倒还好说,如果是几十行甚至几百行,一定会打空格打到吐吧。标尺一秒对齐!只需要选中文字,在标尺处...
  • 电脑中都会有安装一个Word文档,我们可以编辑和整理文件,但是一位用户说做Word文档里,想插入EXCEL图表,但是显示出来的是一段代码,尝试很多次还是一样,怎么办呢?如果你还在为此问题困扰,那么可以参考下文,...
  • 对于这种Word表格,Excel体检统计表一般设计为,每行统计一个个体的所有信息,每列统计所人的某一信息。此体检统计表除了统计信息的数量较学生信息统计表多之外,信息的种类也更加丰富。不像学生统计表,所有信息均...
  • POI填充word文字和图表

    2020-09-03 16:55:49
    } /** * 生成图表 * * @param chart 从模板中获取到的图表 * @param series 图例 * @param categories X轴 * @param values 数据 * @param chartTitle 图标名称 */ public static void generateChart(XWPFChart ...
  • 访问量:12word2013使用起来很快,效果很好,可是发觉一个问题,word2013在win7和win8上老出一个问题,就是插入图表后,无法直接保存,保存点之后还是不能;另一个问题就是插入图表之后,就不能调出数据进行编辑,...
  • 生成图表4.创建word文件5.将分析结果保存入word文件中 本文主要是讲如何根据简单的xlsx数据,生成word数据报告,首先需要先读取与分析xlsx中的数据,通过排序等等方式固定好分析哪些方面,然后来编写对应的代码,对应...
  • qt下操作word生成图表时,有时候会弹出excel停止。如何解决,各位大神。
  • 《计算机基础教程(Word表格制作)》由会员分享,可在线阅读,更多相关《计算机基础教程(Word表格制作)(12页珍藏版)》请在人人文库网上搜索。1、主 编 : 刘 林 ( 江 西 经 纬电 脑 培 训 ) 计算机发展史 表格制作 1...
  • 业务需求要做个word生成图表 再转成pdf预览 于是尝试了 javapoi 的word pdf转换 转换后 发现pdf格式不对劲 图表也丢失 如果是图片就可以转存于是继续尝试 用openoffic 转换 当word转换成pdf后 发现图表依旧丢失 最后...
  • papaja:papaja(Preparing APA Journal Articles)是一个R包,它提供文档格式以从RMarkdown文件(PDF和Word文档)生成完整的APA手稿以及帮助报告统计数据,表格图表的辅助功能。
  • 柱状图 class Program { const int NUM_OF_ROWS = 3; const int NUM_OF_COLUMNS = 10; static void Main(string[] args) { IWorkbook wb = new XSSFWorkbook(); ...
  • 该接口可以导出两种内容形式的word文档,文档内包含有图表数据:统计表格以及数据分析的折线图、柱状图以及饼图。 由于word的导出内容,其格式及描述信息基本是固定的,只有数据和图表会动态变化,因此调研后决定...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,324
精华内容 1,729
关键字:

word表格生成统计图表