String.format("%0"+length+"d", arr)的功能(生成一个唯一id的方法)

本文详细介绍了Java中String.format方法的使用技巧,特别是如何通过格式化字符串来实现数值的标准化显示,如在商品ID生成中应用%03d等格式化选项,并通过实例演示了如何生成带有前导零的字符串。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String.format("%0"+length+"d", arr)中的%0和"d"分别代表什么

length代表的是格式化吼字符串的总长度
d是个占位符,会被arr所替换。
0是在arr转化为字符后,长度达不到length的时候,前面以0 不足。

int a = 3;
        String s = String.format("%03d", a);
        System.out.println(s);
比如这样,输出结果为:003
/**
     * 商品id生成
     */
    public static long genItemId() {
        //取当前时间的长整形值包含毫秒
        long millis = System.currentTimeMillis();
        //long millis = System.nanoTime();  获取当前时间的纳秒数
        //加上两位随机数
        Random random = new Random();
        int end2 = random.nextInt(99);
        //如果不足两位前面补0
        String str = millis + String.format("%02d", end2);
        long id = new Long(str);
        return id;
    }


@Override public void createArticleOutputFromTemplateHttp(HttpServletRequest request, HttpServletResponse response, ArticleData articleData) { if (articleData==null){ log.warn(&quot;勾选模板内容生成word文档的参数为空,不作处理,返回。&quot;); return; } // 获取勾选的内容 Long[] ids = articleData.getIds(); if (ids==null || ids.length<=0){ log.warn(&quot;没有选择需要生成word文档的数据,不作处理,返回。&quot;); return; } // 是否导出备注详情 int notesExportFlag = articleData.getNotesExportFlag(); // 导出数据准备---------------------------------- List<ArticleData> articleDataList = articleDataMapper.selectArticleDataByIds(ids); if (articleDataList==null || articleDataList.size()<=0){ log.warn(&quot;获取的word文档数据为空,不作处理,返回。&quot;); return; } // 批量获取模块数据 ,然后进行排序======================================= // Long[] menu_ids = new Long[articleDataList.size()]; // for(int i=0;i<articleDataList.size();i++){ // menu_ids[i] = articleDataList.get(i).getMenuId(); // } // List<ArticleMenu> menu_list = articleMenuMapper.selectArticleMenuByMenuIds(menu_ids); // // 排序 // Collections.sort(menu_list, new Comparator<ArticleMenu>() { // @Override // public int compare(ArticleMenu o1, ArticleMenu o2) { // // TODO Auto-generated method stub // int flag = (int) (o1.getParentId()-o2.getParentId()); // if(flag == 0){ // flag = (int) (o1.getOrderNum()-o2.getOrderNum()); // } // return flag; // } // }); // ================================================================== // 获取数据 有序数据 // articleData.setMenuIds(menu_ids); // articleDataList = articleDataMapper.selectArticleDataByMenuIdsOrder(articleData); //各个 Long 含义: 层级、menuId(原先为父类模块ID)、排序order_num(注?:确保排序唯一),最底层map:数据、父类ID、排序 Map<Integer,Map<Long, Map<Long, List<Map<String, Object>>>>> myDatasMap = new HashMap<Integer,Map<Long, Map<Long, List<Map<String, Object>>>>>(); //菜单最深层数 int maxLevel = 1; // 菜单纵信息 List<Long[]> list_coloum = new ArrayList<Long[]>(); // 菜单纵信息及后面按显示顺序排序 List<String[]> list_coloum_str = new ArrayList<String[]>(); // 获取模块目录信息 for(ArticleData param : articleDataList){ //这里导出的时候加上备注的内容 if(notesExportFlag>0 && StringUtils.isNotBlank(param.getNotes())){ param.setContent(param.getContent() +&quot;<p><br/></p>&quot; +&quot;<p>***备注***:</p>&quot; +&quot;<p>&quot;+param.getNotes()+&quot;</p>&quot;); } ArticleMenu menu = articleMenuMapper.selectArticleMenuByMenuId(param.getMenuId()); String[] menuIdArr = menu.getAncestors().split(&quot;,&quot;); Long[] menuIdsArr = new Long[menuIdArr.length+1]; // 用于排序(menu_id 和 序号 综合排) String[] menuIdsSort = new String[menuIdArr.length+1]; if(menuIdArr!=null && menuIdArr.length>0){ for(int i=0;i<menuIdArr.length;i++){ menuIdsArr[i] = Long.parseLong(menuIdArr[i].trim()); if(i>0){ ArticleMenu menu_temp = articleMenuMapper.selectArticleMenuByMenuId(Long.parseLong(menuIdArr[i].trim())); menuIdsSort[i] = menuIdArr[i].trim()+&quot;&&&quot;+menu_temp.getOrderNum(); }else{ menuIdsSort[i] = menuIdArr[i].trim(); } } } menuIdsArr[menuIdArr.length] = menu.getMenuId(); list_coloum.add(menuIdsArr); menuIdsSort[menuIdArr.length] = menu.getMenuId()+&quot;&&&quot;+menu.getOrderNum(); list_coloum_str.add(menuIdsSort); if(StringUtils.isNotBlank(param.getArticleVersion())){ param.setTitle(param.getTitle()+&quot;(v&quot;+param.getArticleVersion()+&quot;版本)&quot;); } // 解析获取模块信息-横信息 getArticleMenus(myDatasMap,maxLevel,menuIdsArr,param); } // 数据处理 if(myDatasMap != null && myDatasMap.size()>0){ String resourcePath = System.getProperty(&quot;user.dir&quot;) + &quot;/src/main/resources/&quot;; log.info(&quot;项目resource路径 resourcePath:&quot;+resourcePath); List<Map<String, Object>> dataList = new ArrayList<Map<String, Object>>(); StringBuffer titleSb = new StringBuffer(); // 存放已经遍历到并处理的模块ID List<Long> menus_handled = new ArrayList<Long>(); // 记录多于1个模块的最深层数 int max_level = 0; int max_level_content = 0; // 菜单序号 int menu_num = 0; int ch_menu_num = 0; int ch2_menu_num = 0; int ch3_menu_num = 0; //按menu_id升序排序,之前使用的--20241016 // Collections.sort(list_coloum, new Comparator<Long[]>() { // @Override // public int compare(Long[] o1, Long[] o2) { // // TODO Auto-generated method stub // int flag = 0; // int len = o1.length>o2.length?o2.length:o1.length; // for(int i=0;i<len;i++){ // int diff = (int) (o1[i]-o2[i]); // flag = flag+diff; // } // return flag; // } // }); //按显示顺序升序排序list_coloum_str Collections.sort(list_coloum_str, new Comparator<String[]>() { @Override public int compare(String[] o1, String[] o2) { // TODO Auto-generated method stub int flag = 0; int len = o1.length>o2.length?o2.length:o1.length; for(int i=1;i<len;i++){ int num1 = Integer.parseInt(o1[i].split(&quot;&&&quot;)[1].trim()); int num2 = Integer.parseInt(o2[i].split(&quot;&&&quot;)[1].trim()); int diff = num1 - num2; flag = flag+diff; if(flag!=0){ break; } } return flag; } }); // for(Long[] arr_coloum : list_coloum){ // mu:for(int i=0;i<arr_coloum.length;i++){ // // 当前menuID // Long current_menu_id = arr_coloum[i]; for(String[] arr_coloum : list_coloum_str){ mu:for(int i=0;i<arr_coloum.length;i++){ // 当前menuID Long current_menu_id = Long.parseLong(arr_coloum[i].split(&quot;&&&quot;)[0].trim()); if(current_menu_id==null || current_menu_id==0 || current_menu_id.equals(0)){ continue; } if(menus_handled!=null&&menus_handled.size()>0){ for(Long menuid_handled : menus_handled){ if(menuid_handled.equals(current_menu_id)){ // 已处理的,就跳过 continue mu; } } } //层级、menuId(现为父类模块ID)、排序order_num(注?:确保排序唯一) Map<Long, Map<Long, List<Map<String, Object>>>> current_menu = myDatasMap.get(i); if(current_menu!=null && current_menu.size()>0){ List<Long> contentMenuIdsExist = new ArrayList<Long>(); for(Long current_parent_id : current_menu.keySet()){ Map<Long, List<Map<String, Object>>> current_parent_map = current_menu.get(current_parent_id); if(current_parent_map!=null && current_parent_map.size()>0){ for(Long current_order_num : current_parent_map.keySet()){ List<Map<String, Object>> current_order_list = current_parent_map.get(current_order_num); if(current_order_list!=null && current_order_list.size()>0){ for(Map<String, Object> current_order_map : current_order_list){ Long menuid = (Long) current_order_map.get(&quot;menuId&quot;); if(current_menu_id.equals(menuid)){ log.info(&quot;项目resource路径 resourcePath:&quot;+current_menu_id); // 层级、menuId(现为父类模块ID)、排序order_num(注?:确保排序唯一) int current_level_order = (int) current_order_map.get(&quot;menuLevel&quot;); if(current_menu.size()==1 && current_parent_map.size()==1 && current_order_list.size() == 1 && (max_level_content==0 || (max_level_content>0 &&current_level_order<max_level_content ))){ //说明该模块只有一个,这里作为标题 if(max_level_content>0){ if(current_level_order<max_level_content){ titleSb.append(current_order_map.get(&quot;menuName&quot;)+&quot;_&quot;); max_level = current_level_order; } }else{ titleSb.append(current_order_map.get(&quot;menuName&quot;)+&quot;_&quot;); max_level = current_level_order; } }else{ boolean isExist = false; if(contentMenuIdsExist!=null&&contentMenuIdsExist.size()>0){ for(Long menuKey : contentMenuIdsExist){ if(menuKey.equals(menuid)){ isExist = true; break; } } } if(!isExist){ int current_level = (int) current_order_map.get(&quot;menuLevel&quot;); int level = current_level-max_level<1?1:current_level-max_level; if(current_level>max_level_content){ max_level_content = current_level; } // 给目录加上序号 String title_num = &quot;&quot;; if(level==1){ menu_num++; ch_menu_num = 0; //层级有变化,低一级目录序号清零 ch2_menu_num=0; ch3_menu_num=0; if(menu_num==1){ title_num = &quot;一.&quot;; }else if(menu_num==2){ title_num = &quot;二.&quot;; }else if(menu_num==3){ title_num = &quot;三.&quot;; }else if(menu_num==4){ title_num = &quot;四.&quot;; }else if(menu_num==5){ title_num = &quot;五.&quot;; }else if(menu_num==6){ title_num = &quot;六.&quot;; }else if(menu_num==7){ title_num = &quot;七.&quot;; }else if(menu_num==8){ title_num = &quot;八.&quot;; }else if(menu_num==9){ title_num = &quot;九.&quot;; }else if(menu_num==10){ title_num = &quot;十.&quot;; }else if(menu_num==11){ title_num = &quot;十一.&quot;; }else if(menu_num==12){ title_num = &quot;十二.&quot;; }else if(menu_num==13){ title_num = &quot;十三.&quot;; }else if(menu_num==14){ title_num = &quot;十四.&quot;; }else if(menu_num==15){ title_num = &quot;十五.&quot;; }else if(menu_num==16){ title_num = &quot;十六.&quot;; }else if(menu_num==17){ title_num = &quot;十七.&quot;; }else if(menu_num==18){ title_num = &quot;十八.&quot;; }else if(menu_num==19){ title_num = &quot;十九.&quot;; }else if(menu_num==20){ title_num = &quot;二十.&quot;; }else if(menu_num==21){ title_num = &quot;二十一.&quot;; }else if(menu_num==22){ title_num = &quot;二十二.&quot;; }else if(menu_num==23){ title_num = &quot;二十三.&quot;; }else if(menu_num==24){ title_num = &quot;二十四.&quot;; }else if(menu_num==25){ title_num = &quot;二十五.&quot;; }else if(menu_num==26){ title_num = &quot;二十六.&quot;; }else if(menu_num==27){ title_num = &quot;二十七.&quot;; }else if(menu_num==28){ title_num = &quot;二十八.&quot;; }else if(menu_num==29){ title_num = &quot;二十九.&quot;; }else if(menu_num==30){ title_num = &quot;三十.&quot;; } } if(level==2){ ch_menu_num++; ch2_menu_num=0; ch3_menu_num=0; title_num = menu_num+&quot;.&quot;+ch_menu_num; } if(level==3){ ch2_menu_num++; ch3_menu_num=0; title_num = menu_num+&quot;.&quot;+ch_menu_num+&quot;.&quot;+ch2_menu_num; } if(level==4){ ch3_menu_num++; title_num = menu_num+&quot;.&quot;+ch_menu_num+&quot;.&quot;+ch2_menu_num+&quot;.&quot;+ch3_menu_num; } Map<String, Object> wordData = new HashMap<>(); wordData.put(&quot;directory&quot;, title_num+&quot; &quot;+current_order_map.get(&quot;menuName&quot;)); Map<String, Object> wordDataMap = new HashMap<>(); wordDataMap.put(&quot;templateParth&quot;, resourcePath+&quot;templates/bms_menu&quot;+level+&quot;.docx&quot;); wordDataMap.put(&quot;wordData&quot;, wordData); dataList.add(wordDataMap); } } if(current_order_map.get(&quot;content&quot;)!=null){ //加载内容 ArticleData current_article_data = (ArticleData) current_order_map.get(&quot;content&quot;); if(current_article_data!=null){ int current_level = (int) current_order_map.get(&quot;menuLevel&quot;); int level = current_level-max_level<1?1:current_level-max_level+1; if(current_level>max_level_content){ max_level_content = current_level; } // 给目录加上序号 String title_num = &quot;&quot;; if(level==1){ menu_num++; ch_menu_num = 0; //层级有变化,低一级目录序号清零 ch2_menu_num=0; ch3_menu_num=0; if(menu_num==1){ title_num = &quot;一.&quot;; }else if(menu_num==2){ title_num = &quot;二.&quot;; }else if(menu_num==3){ title_num = &quot;三.&quot;; }else if(menu_num==4){ title_num = &quot;四.&quot;; }else if(menu_num==5){ title_num = &quot;五.&quot;; }else if(menu_num==6){ title_num = &quot;六.&quot;; }else if(menu_num==7){ title_num = &quot;七.&quot;; }else if(menu_num==8){ title_num = &quot;八.&quot;; }else if(menu_num==9){ title_num = &quot;九.&quot;; }else if(menu_num==10){ title_num = &quot;十.&quot;; }else if(menu_num==11){ title_num = &quot;十一.&quot;; }else if(menu_num==12){ title_num = &quot;十二.&quot;; }else if(menu_num==13){ title_num = &quot;十三.&quot;; }else if(menu_num==14){ title_num = &quot;十四.&quot;; }else if(menu_num==15){ title_num = &quot;十五.&quot;; }else if(menu_num==16){ title_num = &quot;十六.&quot;; }else if(menu_num==17){ title_num = &quot;十七.&quot;; }else if(menu_num==18){ title_num = &quot;十八.&quot;; }else if(menu_num==19){ title_num = &quot;十九.&quot;; }else if(menu_num==20){ title_num = &quot;二十.&quot;; }else if(menu_num==21){ title_num = &quot;二十一.&quot;; }else if(menu_num==22){ title_num = &quot;二十二.&quot;; }else if(menu_num==23){ title_num = &quot;二十三.&quot;; }else if(menu_num==24){ title_num = &quot;二十四.&quot;; }else if(menu_num==25){ title_num = &quot;二十五.&quot;; }else if(menu_num==26){ title_num = &quot;二十六.&quot;; }else if(menu_num==27){ title_num = &quot;二十七.&quot;; }else if(menu_num==28){ title_num = &quot;二十八.&quot;; }else if(menu_num==29){ title_num = &quot;二十九.&quot;; }else if(menu_num==30){ title_num = &quot;三十.&quot;; } } if(level==2){ ch_menu_num++; ch2_menu_num=0; ch3_menu_num=0; title_num = menu_num+&quot;.&quot;+ch_menu_num; } if(level==3){ ch2_menu_num++; ch3_menu_num=0; title_num = menu_num+&quot;.&quot;+ch_menu_num+&quot;.&quot;+ch2_menu_num; } if(level==4){ ch3_menu_num++; title_num = menu_num+&quot;.&quot;+ch_menu_num+&quot;.&quot;+ch2_menu_num+&quot;.&quot;+ch3_menu_num; } //目录 Map<String, Object> wordData = new HashMap<>(); wordData.put(&quot;directory&quot;, &quot; &quot;+title_num+&quot; &quot;+current_article_data.getTitle()); Map<String, Object> wordDataMap = new HashMap<>(); //int current_level = (int) current_order_map.get(&quot;menuLevel&quot;); //int level = current_level-max_level<1?1:current_level-max_level; wordDataMap.put(&quot;templateParth&quot;, resourcePath+&quot;templates/bms_menu&quot;+level+&quot;.docx&quot;); wordDataMap.put(&quot;wordData&quot;, wordData); dataList.add(wordDataMap); // 内容 Map<String, Object> theData = new HashMap<>(); //=================================================================== // 测试内容 <p><img src=&quot;/dev-api/profile/upload/2024/07/30/bef0dd24-730b-41e7-946d-b1f86b09149f-(12) 亿纬_EVE-ICR18650_26V _ 知识管理 - PingCode.png&quot; alt=&quot;&quot; width=&quot;872&quot; height=&quot;436&quot; /></p> // File inputFile = new File(&quot;D:/Users/2104020051/Desktop/一些文件/富文本导入导出/亿纬_EVE-ICR18650_26V _ 知识管理 - PingCode.png&quot;); // String base64 = ImageConvertBase64.toBase64(inputFile, true); // log.info(&quot;base64=&quot;+base64.substring(0, 200)+&quot;......&quot;); // String temp_img = &quot;<p><img src=\&quot;&quot;+base64+&quot;\&quot; alt=\&quot;\&quot; width=\&quot;872\&quot; height=\&quot;436\&quot; /></p>&quot;; //==================================================================== ////theData.put(&quot;menu&quot;, current_article_data.getTitle()); //theData.put(&quot;content&quot;, current_article_data.getContent()!=null? // current_article_data.getContent().replaceAll(&quot;/dev-api/profile&quot;, RuoYiConfig.getProfile())+temp_img // :&quot;<span style=\&quot;color: red;\&quot;>~标题为:&quot;+current_article_data.getTitle()+&quot;(id=&quot;+current_article_data.getId()+&quot;)的内容为空</span>&quot;); //针对内容的处理,主要是导出的时候图片的问题 String content = &quot;&quot;; if(current_article_data.getContent()!=null){ //文本编辑器类型(1:Quill富文本编辑器 2:CherryMarkdown 3:Tinymce富文本编辑器) int content_type = Integer.parseInt(current_article_data.getContentType().trim()); if(content_type==1){ content = current_article_data.getContent(); }else if(content_type==2 || content_type==3){ //2:CherryMarkdown 3:Tinymce富文本编辑器 List<String> imgValues = PoiWordUtil.getTagAttributeValues(current_article_data.getContent(), &quot;img&quot;, &quot;src&quot;); if(imgValues!=null && imgValues.size()>0){ // 有图片时 content = current_article_data.getContent(); for (String value : imgValues) { String[] image_url_arr = value.split(Constants.RESOURCE_PREFIX); if(image_url_arr!=null && image_url_arr.length>=2){ //String image_url_local = value.replaceAll(&quot;/dev-api/profile&quot;, RuoYiConfig.getProfile()); //图片全路径 String image_url_local = RuoYiConfig.getProfile()+image_url_arr[1]; //图片全路径 log.info(&quot;图片路径=&quot;+image_url_local); //image_url_local = &quot;D:/Users/2104020051/Desktop/一些文件/富文本导入导出/亿纬_EVE-ICR18650_26V _ 知识管理 - PingCode.png&quot;; //&quot;E:/ruoyi/uploadPath/upload/2024/07/30/bef0dd24-730b-41e7-946d-b1f86b09149f-(12) 亿纬_EVE-ICR18650_26V _ 知识管理 - PingCode.png&quot;; File inputFile = new File(image_url_local); String base64 = ImageConvertBase64.toBase64(inputFile, true); log.info(&quot;base64=&quot;+base64.substring(0, 200)+&quot;......&quot;); log.info(&quot;value=&quot;+value); content = content.replace(value, base64); } } }else{ content = current_article_data.getContent(); } } }else{ content = &quot;<span style=\&quot;color: red;\&quot;>~标题为:&quot;+current_article_data.getTitle()+&quot;(id=&quot;+current_article_data.getId()+&quot;)的内容为空</span>&quot;; } theData.put(&quot;content&quot;, content); Map<String, Object> wordDataMap2 = new HashMap<>(); wordDataMap2.put(&quot;templateParth&quot;, resourcePath+&quot;templates/bms_content.docx&quot;); wordDataMap2.put(&quot;wordData&quot;, theData); dataList.add(wordDataMap2); contentMenuIdsExist.add(menuid); } } menus_handled.add((Long) current_order_map.get(&quot;menuId&quot;)); // 加入已处理集合 } } } } } } } } } Map<String, Object> wordHead_test = new HashMap<>(); wordHead_test.put(&quot;title&quot;, titleSb.substring(0, titleSb.length()-1)); wordHead_test.put(&quot;currentTime&quot;, DateUtils2.getCurrentDateTime()); //首页数据 Map<String, Object> wordHeadMap_test = new HashMap<>(); wordHeadMap_test.put(&quot;templateParth&quot;, resourcePath+&quot;templates/bms_title.docx&quot;); wordHeadMap_test.put(&quot;wordData&quot;, wordHead_test); // 上传文件路径 //String filePath = RuoYiConfig.getPathWithTemplePack(); // 新文件名称 //String current = DateUtils2.format(new Date(), &quot;yyyyMMddHHmmssSSS&quot;); //IdUtils.fastUUID() //String fileName = DateUtils.datePath() + &quot;/&quot;+ &quot;Demo报告-&quot;+ current +&quot;.docx&quot;; //String documentName = titleSb+ current +&quot;.docx&quot;; //String fileName = DateUtils.datePath() + File.separator + documentName; try { //File desc = FileUploadUtils.getAbsoluteFile(filePath, fileName); //String descLocalUrl = desc.getAbsolutePath(); //log.info(&quot;导出路径descLocalUrl:&quot;+descLocalUrl);; // 生成并导出word文档 //PoiWordUtil.createDocxManyForRTFHtml(wordHeadMap_test, dataList, descLocalUrl); PoiWordUtil.createDocxManyForRTFHtmlWithHttp(wordHeadMap_test,dataList,request, response); //WordUtil.createDocxMany(wordHeadMap_test, dataList, descLocalUrl); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 多XWPFTemplate合并成一个word导出,http导出 * @param headMap * @param dataList * @param destParth */ public static void createDocxManyForRTFHtmlWithHttp(Map<String, Object> headMap,List<Map<String, Object>> dataList,HttpServletRequest request, HttpServletResponse response) { LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy(); Configure config = Configure.builder().useSpringEL() .bind(&quot;list&quot;, policy).build(); // 首页标题 String templateParth_head = headMap.get(&quot;templateParth&quot;)!=null?String.valueOf(headMap.get(&quot;templateParth&quot;)).trim():&quot;&quot;; Map<String, Object> wordData_head = headMap.get(&quot;wordData&quot;)!=null?(Map<String, Object>) headMap.get(&quot;wordData&quot;):null; if(StringUtils.isBlank(templateParth_head) || wordData_head==null){ log.warn(&quot;首页标题参数异常,不作解析导出&quot;); return; } XWPFTemplate template_head = XWPFTemplate.compile(templateParth_head,config).render(wordData_head);// 首页数据调用模板,填充数据 if(dataList==null || dataList.size()<=0){ log.warn(&quot;模块数据为空,不作解析导出&quot;); return; } try { //多文档集合 List<NiceXWPFDocument> list = new ArrayList<NiceXWPFDocument>(); NiceXWPFDocument niceXWPFDocument = template_head.getXWPFDocument(); // 生成目录 -------------------------------------------------------------- // 创建标题 XWPFParagraph title = niceXWPFDocument.createParagraph(); XWPFRun titleRun = title.createRun(); //空一行 titleRun.setText(&quot;&quot;); // 设置为空字符串来创建一个新的段落 titleRun.addCarriageReturn(); // 确保这个运行不会与前一个运行合并 //空一行 titleRun = title.createRun(); titleRun.setText(&quot;&quot;); // 设置为空字符串来创建一个新的段落 titleRun.addCarriageReturn(); // 确保这个运行不会与前一个运行合并 titleRun = title.createRun(); titleRun.setText(&quot;目录&quot;); titleRun.setFontSize(16); titleRun.setBold(true); //空一行 titleRun = title.createRun(); titleRun.setText(&quot;&quot;); // 设置为空字符串来创建一个新的段落 titleRun.addCarriageReturn(); // 确保这个运行不会与前一个运行合并 niceXWPFDocument.enforceUpdateFields(); CTAbstractNum cTAbstractNum = CTAbstractNum.Factory.newInstance(); XWPFAbstractNum abstractNum = new XWPFAbstractNum(cTAbstractNum); XWPFNumbering numbering = niceXWPFDocument.createNumbering(); BigInteger numID = numbering.addAbstractNum(abstractNum); BigInteger numberingID = numbering.addNum(numID); // 插入目录 XWPFParagraph toc = niceXWPFDocument.createParagraph(); toc.setPageBreak(true); toc.setWordWrap(true); toc.setAlignment(ParagraphAlignment.CENTER); CTP ctP = toc.getCTP(); CTSimpleField tocField = ctP.addNewFldSimple(); tocField.setInstr(&quot;TOC \\o \&quot;1-3\&quot; \\h \\z \\u&quot;); toc.getCTP().addNewR().addNewFldChar().setFldCharType(STFldCharType.END); // 生成目录end------------------------------------------------------------- XWPFRun runs = niceXWPFDocument.createParagraph().createRun(); //int num = 0; for(Map<String, Object> dataMap : dataList){ String templateParth_data = dataMap.get(&quot;templateParth&quot;)!=null?String.valueOf(dataMap.get(&quot;templateParth&quot;)).trim():&quot;&quot;; Map<String, Object> wordData_data = dataMap.get(&quot;wordData&quot;)!=null?(Map<String, Object>) dataMap.get(&quot;wordData&quot;):null; if(StringUtils.isBlank(templateParth_data) || wordData_data==null){ log.warn(&quot;模版数据参数异常,该数据不作解析导出,下一条..&quot;); continue; } XWPFTemplate template_data = null;//XWPFTemplate.compile(templateParth_data,config).render(wordData_data);// wordData数据调用模板,填充数据 // 富文本的数据 if(wordData_data.get(&quot;content&quot;)!=null){ String content = (String) wordData_data.get(&quot;content&quot;); String tmpContent = content.replace(&quot;<&quot;, &quot;<&quot;).replace(&quot;>&quot;, &quot;>&quot;).replace(&quot;&quot;&quot;, &quot;\&quot;&quot;).replace(&quot;&&quot;, &quot;&&quot;); // 拼接html格式内容 StringBuffer sbf = new StringBuffer(); // 这里拼接一下html标签,便于word文档能够识别 sbf.append(&quot;<html &quot; + &quot;xmlns:v=\&quot;urn:schemas-microsoft-com:vml\&quot; xmlns:o=\&quot;urn:schemas-microsoft-com:office:office\&quot; xmlns:w=\&quot;urn:schemas-microsoft-com:office:word\&quot; xmlns:m=\&quot;http://schemas.microsoft.com/office/2004/12/omml\&quot; xmlns=\&quot;http://www.w3.org/TR/REC-html40\&quot;&quot; + //将版式从web版式改成页面试图 &quot;>&quot;); sbf.append(&quot;<head>&quot; + &quot;<!--[if gte mso 9]><xml><w:WordDocument><w:View>Print</w:View><w:TrackMoves>false</w:TrackMoves><w:TrackFormatting/><w:ValidateAgainstSchemas/><w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid><w:IgnoreMixedContent>false</w:IgnoreMixedContent><w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText><w:DoNotPromoteQF/><w:LidThemeOther>EN-US</w:LidThemeOther><w:LidThemeAsian>ZH-CN</w:LidThemeAsian><w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript><w:Compatibility><w:BreakWrappedTables/><w:SnapToGridInCell/><w:WrapTextWithPunct/><w:UseAsianBreakRules/><w:DontGrowAutofit/><w:SplitPgBreakAndParaMark/><w:DontVertAlignCellWithSp/><w:DontBreakConstrainedForcedTables/><w:DontVertAlignInTxbx/><w:Word11KerningPairs/><w:CachedColBalance/><w:UseFELayout/></w:Compatibility><w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel><m:mathPr><m:mathFont m:val=\&quot;Cambria Math\&quot;/><m:brkBin m:val=\&quot;before\&quot;/><m:brkBinSub m:val=\&quot;--\&quot;/><m:smallFrac m:val=\&quot;off\&quot;/><m:dispDef/><m:lMargin m:val=\&quot;0\&quot;/> <m:rMargin m:val=\&quot;0\&quot;/><m:defJc m:val=\&quot;centerGroup\&quot;/><m:wrapIndent m:val=\&quot;1440\&quot;/><m:intLim m:val=\&quot;subSup\&quot;/><m:naryLim m:val=\&quot;undOvr\&quot;/></m:mathPr></w:WordDocument></xml><![endif]-->&quot; + &quot;</head>&quot;); sbf.append(&quot;<body>&quot;); // 富文本内容 sbf.append(tmpContent); sbf.append(&quot;</body></html>&quot;); HtmlRenderPolicy htmlRenderPolicy1 = new HtmlRenderPolicy(); Configure configure1 = Configure.builder() .bind(&quot;content&quot;, htmlRenderPolicy1) .build(); Map<String, Object> data1 = new HashMap<>(); data1.put(&quot;content&quot;, sbf.toString()); template_data = XWPFTemplate.compile(templateParth_data, configure1).render(data1); }else{ template_data = XWPFTemplate.compile(templateParth_data,config).render(wordData_data); } list.add(template_data.getXWPFDocument()); template_data.close(); } NiceXWPFDocument newDoc = niceXWPFDocument.merge(list,runs); //合并多个 //FileOutputStream out = new FileOutputStream(destParth);//要导出的文件名 //输出文件 request.setCharacterEncoding(&quot;utf-8&quot;); //request.setAttribute(paramString, paramObject);.setAsyncTimeout(10000); //导出word格式&quot;application/msword&quot; -doc &quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document&quot; -docx response.setContentType(&quot;application/vnd.openxmlformats-officedocument.wordprocessingml.document&quot;); //response.setHeader(&quot;Access-Control-Expose-Headers&quot;,&quot;Content-disposition&quot;); response.addHeader(&quot;Content-Disposition&quot;, &quot;attachment;filename=&quot; + wordData_head.get(&quot;title&quot;) + &quot;.docx&quot;); //过期时间设置 //response.setDateHeader(&quot;expires&quot;,System.currentTimeMillis() + 60 * 1000); ServletOutputStream out = response.getOutputStream(); newDoc.write(out); out.flush(); out.close(); newDoc.close(); niceXWPFDocument.close(); template_head.close(); log.info(&quot;导出生成完成...&quot;); } catch (Exception e) { e.printStackTrace(); } } 这是导出文档的两个方法,现在文档内容的字体比标题的还要大,如何规范调整好文档正文的字体大小和格式
最新发布
07-30
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值