Java格式化文本

java格式化doc,按模板填充

 

参考:Poi-tl Documentation

Java读取String分行字符串的方法

1、场景:String字符串中带有分行,需要提取每一行出来处理。

2、参考代码如下:

public static void main(String[] args) throws IOException{
 String s="1\r\n2\r\n3\r\n \r\nabd\r\n";
 BufferedReader br = new BufferedReader(new InputStreamReader(new         
 ByteArrayInputStream(s.getBytes(Charset.forName("utf8"))), Charset.forName("utf8"))); 
 String line; 
 StringBuffer strbuf=new StringBuffer();
 while ( (line = br.readLine()) != null ) { 
 if(!line.trim().equals("")){
 line="<br>"+line;//每行可以做加工
 strbuf.append(line+"\r\n");
 }  
 } 
 System.out.println(strbuf.toString());
 }

执行结果:

<br>1
<br>2
<br>3
<br>abd

扩展:格式化指定文本

注:{{value}}:直接填充;[item]:循环行填充

mian方法


	
	public static void main(String[] args) throws IOException {
        // 模板
		String content = "     {{stu_name}}同学成绩单\r\n" + 
				"------------------------------\r\n" + 
				"|   科目   |   成绩   | 排名 |\r\n" + 
				"|   [subject]   |    [score]    |  [rank]   |\r\n" + 
				"------------------------------\r\n" + 
				"               {{year}}年{{month}}月{{day}}日";
		DataRow dr = new DataRow();
    	dr.set("stu_name", "王小白");
    	dr.set("year", "2021");
    	dr.set("month", "07");
    	dr.set("day", "16");
    	List<DataRow> list = new ArrayList<DataRow>();
    	DataRow item = new DataRow();
    	item.set("subject", "英语");
    	item.set("score", "99");
    	item.set("rank", "2");
    	list.add(item);
    	DataRow item2 = new DataRow();
    	item2.set("subject", "数学");
    	item2.set("score", "83");
    	item2.set("rank", "6");
    	list.add(item2);
    	dr.set("list", list);
    	System.out.println(formatContent(dr, content));
	}

 格式化模板:

    @SuppressWarnings("unchecked")
	public static String formatContent(DataRow dr, String content) throws IOException {
    	// 先将文本一行一行读取存list
    	List<String> strList = new ArrayList<>();
    	BufferedReader br = 
    			new BufferedReader(new InputStreamReader(new ByteArrayInputStream(content.getBytes(Charset.forName("utf-8"))), Charset.forName("utf-8")));
    	String line;
    	while ((line = br.readLine()) != null) {
    		// 只取非空行的文本
    		if (!"".equals(line.trim())) {
    			strList.add(line);
    		}
    	}
    	// 格式化后的文本
    	StringBuilder strBuilder = new StringBuilder();
		String enter = "\r\n";
		boolean flag = false; // 当前行是否需要填充数据
		String itemLineStr = null; // 需要填充的行数据
        Set<String> keySet = dr.keySet();
        String str = null;
        String strLine = null;
		for (int i = 0; i < strList.size(); i++) {
			flag = false;
			strLine = strList.get(i);
			for (Object key : keySet) {
				// 直接填充文本
	        	if (dr.get(key) instanceof String) {
	        		str = "{{" + key + "}}";
	        		if (strLine.indexOf(str) != -1) {
	        			if (itemLineStr == null) {
	        				itemLineStr = strLine;
	        			}
	        		}
	        		// 填充行文本
	        		if (itemLineStr != null) {
        				str = "{{" + key + "}}";
        				if (itemLineStr.indexOf(str) != -1) {
        					flag = true;
        					// 填充行
        					itemLineStr = itemLineStr.replace(str, String.valueOf(dr.get(key)));
        				}
	        		}
	        	}
	        	// 循环填充行
	        	if (!flag && dr.get(key) instanceof List) {
	        		itemLineStr = null;
	        		List<DataRow> listDr = (List<DataRow>) dr.get(key);
	        		a:for (DataRow itemDr : listDr) {
	        	        Set<String> itemKeySet = itemDr.keySet();
	        	        for (Object itemKey : itemKeySet) {
	    	        		str = "[" + itemKey + "]";
	    	        		if (strLine.indexOf(str) != -1) {
	    	        			if (itemLineStr == null) {
	    	        				// 取出需要循环的行数据
	    	        				itemLineStr = strLine;
	    	        				break a;
	    	        			}
	    	        		}
	        	        }
					}
	        		
	        		// 循环填充
	        		if (itemLineStr != null) {
	        			for (DataRow itemDr : listDr) {
	        				String forLineTemp = itemLineStr;
							Set<String> itemKeySet = itemDr.keySet();
	        				for (Object itemKey : itemKeySet) {
	        					str = "[" + itemKey + "]";
	        					if (itemLineStr.indexOf(str) != -1) {
    	    	        			flag = true;
    	    	        			// 填充循环行
    	    	        			forLineTemp = forLineTemp.replace(str, String.valueOf(itemDr.get(itemKey)));
	        					}
	        				}
	        				strBuilder.append(forLineTemp + enter);
	        			}
	        			itemLineStr = null; // 循环行置空
	        		}
	        	}
			}
			if (itemLineStr != null) {
				strBuilder.append(itemLineStr + enter);
				itemLineStr = null;
			}
			// 不需要填充的行
			if (!flag) {
				strBuilder.append(strLine + enter);
			}
		}
    	return strBuilder.toString();
    }

 执行结果:

	     王小白同学成绩单
------------------------------
|   科目   |   成绩   | 排名 |
|   英语   |    99    |  2   |
|   数学   |    83    |  6   |
------------------------------
               2021年07月16日

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值