• 解析xml文件


    package com.pasc.ams.report.util;

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.io.OutputStreamWriter;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;

    import org.springframework.security.crypto.codec.Base64;

    import com.pasc.ams.commons.AmspmsProperties;
    import com.pasc.ams.report.dto.TransferInstructionDireDTO;
    import com.pasc.pasmp.core.logging.PasmpLogger;

    /**
     * word模板解析工具类
     * 陈超
     *
     * %转换百分比 例子 ${price?'%'}
     * ‰转换千分比 例子 ${price?'‰'}
     * 转换日期 例子 ${date?'*:yyyy-MM-dd: 年 月 日 时  分'}
     * #转换货币 例子 ${price?'#,####.00'}
     * >转换大写 例子 ${price?'>'}
     *
     */
    public class WordTemplateTransfer {
        
        private static final String TEMPLET_PATH = AmspmsProperties.ORDER_TEMPLATE_PATH;
        
        private static final String SIGNATURE_PATH = AmspmsProperties.ORDER_SIGNATURE_PATH;
        
        private static final String BLANK_IMG = "BLANK.png";
        
        /**
         * 解析并填充模板信息
         * @throws Exception
         */
        public String createTransferDoc(String templetName, TransferInstructionDireDTO dto) throws Exception{
            try {
                String fileName = TEMPLET_PATH + templetName;
                String fileStr = fileToString(fileName);
                fileStr = filtFileString(fileStr);
                
                Map<String, Object> map = dto.getMap();
                ReportWordTransferInstructionUtil.setSignValue(map, dto.getSignatureList());
                
                String fileStrValue = transfer(fileStr,map);
                return fileStrValue;
            }  catch (Exception e) {
                e.printStackTrace();
                PasmpLogger.error("", this.getClass(), "createDoc", "创建模板报错!", e);
            }  
            return "";
        }
        
        /**
         * 创建解析并填充了值的word文档--用于测试
         * @throws Exception
         */
        public String createTransferDocTest(String templetName, TransferInstructionDireDTO dto) throws Exception{
            try {
                
                File file = new File("D:\xml");
                File[] fils = file.listFiles();
                String fileName = "";
                if( fils != null && fils.length > 0 ){
                    for( int i=0;i<fils.length ; i++ ){
                        String filePath = fils[i].getAbsolutePath();
                        fileName = fils[i].getName();
                        
                        String fileStr = fileToString(filePath);
                        fileStr = filtFileString(fileStr);
                        String fileStrValue = transfer(fileStr,dto.getMap());
                        
                        //写出部分
                        FileOutputStream fos = null;
                        OutputStreamWriter osw = null;
                        
                        fos = new FileOutputStream("D:\transXml\"+fileName+".doc");
                        osw = new OutputStreamWriter(fos, "UTF-8");
                        osw.write(fileStrValue);
                        osw.flush();
                        fos.close();
                        osw.close();
                    }
                }
                //System.out.println("fils : " +fils.length );
                //String base = "D:\xml";
               // String fileName = base + "\BOHAI.xml";
             
            }  catch (Exception e) {
                e.printStackTrace();
                PasmpLogger.error("", this.getClass(), "createDoc", "创建模板报错!", e);
            }  
            return "";
        }
        
        /**
         * 过滤判断标签
         */
        private String filtFileString(String str){
            String fileStr = str.replaceAll("<#.*?>", "");
            fileStr = fileStr.replaceAll("</#.*?>", "");
            return fileStr;
        }
        
        /**
         * 解析字符串
         */
        public String transfer(String orgStr , Map<String,Object> dataMap){
            if( orgStr == null || "".equals( orgStr.trim() ) ){
                return "";
            }
            String result = replaceValue( orgStr , getValueMap(orgStr,dataMap) );
            return result;
        }
        
        /**
         * 获取所有标签及对应值的map
         */
        private Map<String,String> getValueMap(String orgStr , Map<String,Object> dataMap){
            //获取所有的标签值
            List<String> labels = getSpilt(orgStr);
            Map<String,String> result = new HashMap<String,String>();
            if( labels != null && labels.size() > 0 ){
                for( String label : labels ){
                    String labelValue = transferSigleLabel( label , dataMap );
                    if( labelValue != null && !"".equals(labelValue) ){
                        result.put( label , labelValue) ;
                    }else{
                        result.put( label , "") ;
                    }
                }
            }
            return result;
        }
        
        /**
         * 替换所有标签中的值
         */
        private String replaceValue( String orgStr , Map<String,String> valueMap ){
            String reulstValue = orgStr;
            if( valueMap != null && valueMap.size() > 0 ){
                Object objs[] = valueMap.keySet().toArray();
                for( int i = 0 ; i<objs.length;i++ ){
                    reulstValue = reulstValue.replace(objs[i].toString(), valueMap.get( objs[i].toString() ));
                }
            }
            return reulstValue;
        }
        
        /**
         * 把标签转换成值字符串
         */
        private String transferSigleLabel(String label , Map<String,Object> dateMap){
            if( dateMap == null || dateMap.size() == 0 || label == null || label.trim().equals("")){
                return "";
            }
            String datePamaramsStr = getSpecial( label );
            String orgFieldStr = getOrgField(label);
            
            String result = "";
            if( datePamaramsStr == null || "".equals( datePamaramsStr ) || datePamaramsStr.indexOf( "&" ) >= 0){
                result = transferString(datePamaramsStr,orgFieldStr,dateMap);
            }else{
                result = transferDate(datePamaramsStr,orgFieldStr,dateMap); //转换日期
                if( "".equals(result) )  result = transferPercent(datePamaramsStr,orgFieldStr,dateMap); //转换百分比
                if( "".equals(result) )  result = transferPermillage(datePamaramsStr,orgFieldStr,dateMap); //转换千分比
                if( "".equals(result) )  result = transferCoin(datePamaramsStr,orgFieldStr,dateMap); //转换货币
                if( "".equals(result) )  result = transferCase(datePamaramsStr,orgFieldStr,dateMap); //转换大小写
                if( "".equals(result) )  result = transferPicture(datePamaramsStr,orgFieldStr,dateMap); //转换图片
            }
            return result;
        }
        
        /**
         * 转换成字符串,如果没有带参数,默认就转换成字符串
         */
        private String transferString(String datePamaramsStr, String orgFieldStr , Map<String,Object> dateMap ){
            if( orgFieldStr != null && !"".equals( orgFieldStr ) ){
                Object obj = dateMap.get( orgFieldStr );
                if( obj == null ){
                    return null;
                    //throw new RuntimeException("没有找到字段:" + orgFieldStr);
                }
                String value = obj.toString();
                if( datePamaramsStr != null && !"".equals( datePamaramsStr ) && datePamaramsStr.indexOf( "&" ) >= 0){
                    DecimalFormat formatFloat = new DecimalFormat(datePamaramsStr);
                    value = formatFloat.format(value);
                }
                return value;
            }
            return "";
        }
        
        /**
         *
         * 获取日期值,返回""说明没有匹配成功,返回null说明dto中没有值,那这个字段就不需要再匹配下面的类型了
         */
        private String transferDate( String datePamaramsStr, String orgFieldStr , Map<String,Object> dateMap ){
            if( datePamaramsStr != null && !"".equals( datePamaramsStr ) && datePamaramsStr.indexOf("*") >= 0 ){
                try {
                    String[] params = parseDateParament(datePamaramsStr);
                    Object obj = dateMap.get( orgFieldStr );
                    if( obj == null ){
                        return params[2];
                        //throw new RuntimeException("没有找到字段:" + orgFieldStr);
                    }
                   
                    SimpleDateFormat sdf = new SimpleDateFormat(params[1]);
                    Date value = null;
                    if( obj instanceof Date) {
                        value = (Date)obj;
                    } else if( obj instanceof String ){
                        value = sdf.parse(obj.toString());
                    }
                    return sdf.format(value);
                } catch (Exception e) {
                    //如果参数不能匹配日期转换,说明不是日期格式
                    throw new RuntimeException("日期格式转换出错:" + datePamaramsStr);
                }
            }
            return "";
        }
        
        /**
         * 日期参数转换,因为日期参数比较复杂,是有'*:yyyy-MM-dd: 年 月 日 时 分'组成,所以需要特别解析,
         *  年 月 日 时 分 此部分表示值为空时,需要显示的值。
         */
        private String[] parseDateParament(String datePamaramsStr){
            if(datePamaramsStr == null || "".equals( datePamaramsStr ) || datePamaramsStr.indexOf("*")<0 || datePamaramsStr.indexOf(":")<0){
                return null;
            }
            return datePamaramsStr.split(":");
        }
        
        /**
         * 转换百分比
         */
        private String transferPercent(String datePamaramsStr, String orgFieldStr , Map<String,Object> dateMap ){
            if( datePamaramsStr != null && !"".equals( datePamaramsStr ) && datePamaramsStr.indexOf( "%" ) >= 0){
                Object obj = dateMap.get( orgFieldStr );
                if( obj == null ){
                    return null;
                   // throw new RuntimeException("没有找到字段:" + orgFieldStr);
                }
                String value = obj.toString();
                Double d = Double.parseDouble( value );
                d = d * 100;
                return d.toString() + "%";
            }
            return "";
        }
        
        /**
         * 转换千分比‰  
         */
        private String transferPermillage( String datePamaramsStr, String orgFieldStr , Map<String,Object> dateMap  ){
            if( datePamaramsStr != null && !"".equals( datePamaramsStr ) && datePamaramsStr.indexOf( "‰" ) >= 0){
                Object obj = dateMap.get( orgFieldStr );
                if( obj == null ){
                    return null;
                    //throw new RuntimeException("没有找到字段:" + orgFieldStr);
                }
                String value = obj.toString();
                Double d = Double.parseDouble( value );
                d = d * 1000;
                return d.toString() + "‰";
            }
            return "";
        }
        
        /**
         * 转换货币
         */
        private String transferCoin(String datePamaramsStr, String orgFieldStr , Map<String,Object> dateMap ){
            if( datePamaramsStr != null && !"".equals( datePamaramsStr ) && datePamaramsStr.indexOf( "#" ) >= 0){
                Object obj = dateMap.get( orgFieldStr );
                if( obj == null ){
                    return null;
                    //throw new RuntimeException("没有找到字段:" + orgFieldStr);
                }
                String value;
                try {
                    value = obj.toString();
                    DecimalFormat formatFloat = new DecimalFormat(datePamaramsStr);
                    value = formatFloat.format(Double.valueOf(value));
                } catch (RuntimeException e) {
                    throw new RuntimeException("货币格式转换出错:" + datePamaramsStr);
                }
                return value;
            }
            return "";
        }
        
        /**
         * 转换大写
         */
        private String transferCase(String datePamaramsStr, String orgFieldStr , Map<String,Object> dateMap ){
            if( datePamaramsStr != null && !"".equals( datePamaramsStr ) && datePamaramsStr.indexOf( ">" ) >= 0){
                Object obj = dateMap.get( orgFieldStr );
                if( obj == null ){
                    return null;
                    //throw new RuntimeException("没有找到字段:" + orgFieldStr);
                }
                Double value;
                String result = "";
                try {
                    value = Double.valueOf(obj.toString());
                    result = digitUppercase(value);
                }catch (RuntimeException e) {
                    throw new RuntimeException("大小写转换出错:" + datePamaramsStr);
                }
                return result;
            }
            return "";
        }
        
        /**
         * 转换图片
         */
        private String transferPicture(String datePamaramsStr, String orgFieldStr , Map<String,Object> dateMap ){
            if( datePamaramsStr != null && !"".equals( datePamaramsStr ) && datePamaramsStr.indexOf( "@" ) >= 0){
                Object obj = dateMap.get( orgFieldStr );
                if( obj == null ){
                    return null;
                    //throw new RuntimeException("没有找到字段:" + orgFieldStr);
                }
                String result = "";
                try {
                    result = getSignValue(orgFieldStr, dateMap);
                }catch (Exception e) {
                    throw new RuntimeException("转换图片出错:" + datePamaramsStr);
                }
                return result;
            }
            return "";
        }
        
        /**
         * 获取标签中的原始字段名
         */
        private String getOrgField( String str ){
            if( str == null || "".equals(str.trim()) || str.indexOf("${") < 0 ){
                return "";
            }
            str = str.replaceAll("<.*?>", "");
            String result = "";
            //没有参数的情况
            if( str.indexOf( "?" ) < 0 ){
                result = str.substring( str.indexOf("{")+1,str.lastIndexOf("}") );
            }else{
                result =str.substring( str.indexOf("{")+1,str.lastIndexOf("?") );
            }
            result = result.replace("!", "");
            result = result.trim();
            return result;
        }
        
        
        /**
         * 获取标签中带''的部分
         */
        private String getSpecial(String str){
            if( str == null || "".equals(str.trim()) || str.indexOf("'") < 0){
                return "";
            }
            str = str.replaceAll("<.*?>", "");
            String temp = str.substring(str.indexOf("'")+1,str.lastIndexOf("'"));
            temp = temp.trim();
            return temp;
        }
        
        /**
         * 获取所有标签元素
         */
        private  List<String> getSpilt(String inputString){
            if (inputString == null || inputString.trim().equals("")) {    
                return null;    
             }
            String regex = "\$\{.*?\}";
            Pattern p = Pattern.compile(regex);
            Matcher m = p.matcher(inputString);
            List<String> list = new ArrayList<String>();
            while (m.find()) {
                list.add( m.group() );
            }
            return list;
        }
        
        /**
         * 获取图片的base64转码
         */
        public static String getSignValue(String key , Map<String,Object> dateMap) throws Exception{
            Object obj = dateMap.get(key);
            String result = "";
            if (obj != null && !"".equals(obj.toString())) {
                result = getImgString(obj.toString() + ".png");
            } else {
                result = getImgString("");
            }
            return result;
        }
        
        /**
         * 图片转换
         */
        public static String getImgString(String imgName) throws IOException {
                if (imgName == null || "".equals(imgName)) {
                        imgName = BLANK_IMG;
                }
                
                InputStream in = new FileInputStream(new File(SIGNATURE_PATH + imgName));
                byte[] data = new byte[in.available()];
                in.read(data);
                in.close();
                
                return new String(Base64.encode(data));
        }
        
        /**
         * 大小写转换
         */
        public static String digitUppercase(double number) {
                if (0d == number) {
                        return "零";
                }
                if (number >= 1000000000000.0d || number <= -1000000000000.0d) {
                        return "超出系统自动转换范围";
                }
                String digit[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"};
                String unit[] = {"元", "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟"};
                String fraction[] = {"分", "角"};
                StringBuilder result = new StringBuilder(32);
                
                if (number < 0d) {
                        result.append("负");
                        number = 0d - number;
                }
                
                long yuan = (long) number;
                int fen = (int) ((number - yuan) * 100);
                
                for (int i = 11; i > -1 ; i--) {
                        int quotient = (int) (yuan / ((long) Math.pow(10, i)));
                        result.append(digit[quotient]).append(unit[i]);
                        yuan -= (long) (Math.pow(10, i) * quotient);
                }
                
                if (fen == 0) {
                        result.append("整");
                } else {
                        for (int i = 1; i > -1; i--) {
                                int quotient = fen / (int) Math.pow(10, i);
                                result.append(digit[quotient]).append(fraction[i]);
                                fen -= (long) (Math.pow(10, i) * quotient);
                        }
                }
                            
                return result.toString().replaceAll("零(仟|佰|拾)", "零")
                                                                .replaceAll("(零)+", "零")
                                                                .replaceAll("亿零万", "亿零")
                                                                .replaceAll("(零)+", "零")
                                                                .replaceAll("零(亿|万|元)", "$1")
                                                                .replaceAll("零角", "零")
                                                                .replaceAll("零分", "")
                                                                .replaceAll("(零)+", "零")
                                                                .replaceAll("^(亿|万|元|角|零)+", "")
                                                                .replaceAll("负(亿|万|元|角|零)+", "负");
        }
        
        /**
         * 文件转换成字符串
         */
        public static String fileToString(String fileName) throws Exception{
            File file = new File( fileName );
            if( file != null && file.exists()){
                StringBuffer sb = new StringBuffer();
                if( file.isFile() ){
                    FileInputStream fis = new FileInputStream(fileName);
                    InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
                    BufferedReader br = new BufferedReader(isr);
                    String text = "";
                    while((text = br.readLine()) != null){
                        sb.append( text );
                    }
                    return sb.toString();
                }
            }
            return "";
        }
    }

  • 相关阅读:
    Ubuntu oracle SDK替换OpenJDK
    用update-alternatives管理java版本
    安卓配置
    CS 159: Advanced Topics in Machine Learning: Structured Prediction
    ros bag 代码操作
    vim 方式快捷编辑代码
    文件权限
    操作系统连不上网
    github权限管理
    nmap基本命令使用
  • 原文地址:https://www.cnblogs.com/chchao/p/3816505.html
Copyright © 2020-2023  润新知