目录
二、通过Java小工具SVNLog2Excel完成xml转成excel
一、背景和处理的思路:
我们经常在SVN提交代码并标记change log,一旦我们需要某个系统的变更日志记录,我们就可以轻松从SVN上查询,但是复制出来的日志是不规则的文本数据,下面将教大家如何将SVN的日志转成我们想要的excel格式。
1.先通过SVN的命令行将指定svn URL的log以xml的形式輸出到文件中
2.通过Java的小程序解析xml文件并输出到excel表格里面
二、SVN命令导出到xml文件
在SVN服务器上的cmd里面执行
svn log --username test --password password https://192.168.1.1/svn/sourcecode/test --xml >svnchangelog.xml
就会在当前的路径生成一个xml文件
二、通过Java小工具SVNLog2Excel完成xml转成excel
svnlog.xml是源xml文件名字,
changelog.xls生成的表格文件名字,
jar程序和xml文件放在一个路径下
java -jar SVNLog2Excel.jar svnchangelog.xml svnchangelog.xls
三、Java源代码分享
需要添加额外的jar包:jxl.jar
SvnLog.java
package com.zsx.svnlog;
public class SvnLog {
private String revision = "";
private String author = "";
private String date = "";
private String paths = "";
private String msg = "";
public SvnLog(){
}
public void setRevision(String s){
this.revision = s;
}
public String getRevision(){
return this.revision;
}
public void setAuthor(String s){
this.author = s;
}
public String getAuthor(){
return this.author;
}
public void setDate(String s){
this.date = s;
}
public String getDate(){
return this.date;
}
public void setPaths(String s){
this.paths = s;
}
public String getPaths(){
return this.paths;
}
public void setMsg(String s){
this.msg = s;
}
public String getMsg(){
return this.msg;
}
}
svnlogXMLHandler.java
package com.zsx.svnlog;
import java.util.ArrayList;
import java.util.List;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
public class svnlogXMLHandler extends DefaultHandler {
private List<SvnLog> svnlogs;
private SvnLog svnlog;
private String whichElement;
private String paths = "";
private int pathNum = 0;
public final static String LOGENTRY = "logentry";
public final static String REVISION = "revision";
public final static String AUTHOR = "author";
public final static String DATE = "date";
public final static String PATHS = "paths";
public final static String PATH = "path";
public final static String ACTION = "action";
public final static String MSG = "msg";
public List<SvnLog> getSvnLogs(){
return svnlogs;
}
@Override
public void startDocument() throws SAXException {
svnlogs = new ArrayList<SvnLog>();
}
@Override
public void characters(char[] ch, int start, int length) {
if(whichElement!=null){
String valueString = new String(ch, start, length);
if(AUTHOR.equals(whichElement)){
svnlog.setAuthor(valueString);
}else if(DATE.equals(whichElement)){
svnlog.setDate(valueString);
}else if(PATH.equals(whichElement)){
paths = paths + valueString ;
}else if(MSG.equals(whichElement)){
svnlog.setMsg(valueString);
}
}
}
@Override
public void startElement (String uri, String localName, String name,
Attributes attributes) throws SAXException {
if(LOGENTRY.equals(name)) {
svnlog = new SvnLog();
svnlog.setRevision(new String(attributes.getValue(REVISION)));
}else if(PATH.equals(name)) {
paths = paths + (pathNum != 0? System.getProperty("line.separator"):"") + (new String(attributes.getValue(ACTION))) + " ";
pathNum ++ ;
}else if(PATHS.equals(name)){
pathNum = 0;
}
whichElement = name;
}
@Override
public void endElement(String uri, String localName, String name)
throws SAXException {
if(LOGENTRY.equals(name) ) {
svnlogs.add(svnlog);
svnlog = null;
} else if (PATHS.equals(name)) {
svnlog.setPaths(paths);
paths = "";
}
whichElement = null;
}
@Override
public void endDocument () {
}
}
toExcel.java
package com.zsx.svnlog;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
/**
* 功能,用于将SVN日志的xml格式换成表格xls
* Created by Andy on 2021/8/23.
*/
public class toExcel {
public static List<SvnLog> getSvnLogs(String filename) throws Exception {
InputStream inStream = new FileInputStream(new File(filename));
SAXParserFactory spf = SAXParserFactory.newInstance(); // 初始化sax解析器
SAXParser sp = spf.newSAXParser(); // 创建sax解析器
svnlogXMLHandler handler = new svnlogXMLHandler();
sp.parse(inStream, handler);
return handler.getSvnLogs();
}
/**
* @param args
*/
public static void main(String[] args) {
if(args.length != 2) {
System.out.println("Please input src file(***.xml) and target file(***.xls)");
System.out.println("ex: java -jar svnlog2excel.jar changlog.xml test2.xls");
return;
}
String targetFile = args[1];
String srcFile = args[0];
File file = new File(targetFile);
Label label;
try {
List<SvnLog> svnlogs = getSvnLogs(srcFile);
WritableWorkbook workbook = Workbook.createWorkbook(file);
WritableSheet sheet = workbook.createSheet("test1", 0);
WritableFont wtf = new WritableFont(WritableFont.createFont("宋体"),14,WritableFont.BOLD,false);
WritableCellFormat wcfmt = new WritableCellFormat(wtf);
wcfmt.setAlignment(jxl.format.Alignment.CENTRE);
int c= 0;
sheet.setColumnView(c, 14);
label = new Label(c++, 0, svnlogXMLHandler.REVISION, wcfmt);
sheet.addCell(label);
sheet.setColumnView(c, 14);
label = new Label(c++, 0, svnlogXMLHandler.AUTHOR, wcfmt);
sheet.addCell(label);
sheet.setColumnView(c, 11);
label = new Label(c++, 0, svnlogXMLHandler.DATE, wcfmt);
sheet.addCell(label);
sheet.setColumnView(c, 40);
label = new Label(c++, 0, svnlogXMLHandler.MSG, wcfmt);
sheet.addCell(label);
sheet.setColumnView(c, 100);
label = new Label(c++, 0, svnlogXMLHandler.PATHS, wcfmt);
sheet.addCell(label);
WritableFont wtf2 = new WritableFont(WritableFont.createFont("Arial"),10,WritableFont.NO_BOLD,false);
WritableCellFormat wcfmt2 = new WritableCellFormat(wtf2);
wcfmt2.setVerticalAlignment(jxl.format.VerticalAlignment.TOP);
WritableCellFormat wcfmt3 = new WritableCellFormat(wtf2);
wcfmt3.setVerticalAlignment(jxl.format.VerticalAlignment.TOP);
wcfmt3.setAlignment(jxl.format.Alignment.CENTRE);
for (int i=0; i<svnlogs.size(); i++){
int j = 0;
label = new Label(j++, i+1, svnlogs.get(i).getRevision(), wcfmt3);
sheet.addCell(label);
label = new Label(j++, i+1, svnlogs.get(i).getAuthor(), wcfmt2);
sheet.addCell(label);
label = new Label(j++, i+1, svnlogs.get(i).getDate(), wcfmt2);
sheet.addCell(label);
label = new Label(j++, i+1, svnlogs.get(i).getMsg(), wcfmt2);
sheet.addCell(label);
label = new Label(j++, i+1, svnlogs.get(i).getPaths(), wcfmt2);
sheet.addCell(label);
}
workbook.write();
workbook.close();
} catch (IOException e) {
e.printStackTrace();
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
打包时Main-class指向 com.zsx.svnlog.toExcel
github的开源地址:https://github.com/gmaaa123/SVNLog2Excel