java格式化doc,按模板填充
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日