zoukankan      html  css  js  c++  java
  • java html table 转 excel,给予jdom 和 poi

    maven 引入

    <dependency>
                <groupId>org.jdom</groupId>
                <artifactId>jdom</artifactId>
                <version>1.1.3</version>
    </dependency>

    工具类

    import java.io.ByteArrayInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.BorderStyle;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.FillPatternType;
    import org.apache.poi.ss.usermodel.Font;
    import org.apache.poi.ss.usermodel.HorizontalAlignment;
    import org.apache.poi.ss.usermodel.IndexedColors;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.ss.util.CellRangeAddress;
    import org.jdom.Document;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder; 
    
    /**根据table的html代码生成excel
     * @param args
     * zyn
     * 2012-12-19 上午11:35:30
     */ 
    public class TableToExcelUtil { 
    
    
        /**
         *  
         * @param sheetName
         * @param html
         * @param headNum表头的行数
         * @throws FileNotFoundException
         * zyn
         * 2012-12-21 下午1:44:02
         */ 
        @SuppressWarnings("unchecked")
        public static void  createExcelFormTable(String sheetName,String html,int headNum) throws FileNotFoundException{ 
            HSSFWorkbook wb = new HSSFWorkbook(); 
            HSSFSheet sheet = wb.createSheet(sheetName); 
            CellStyle headStyle = createHeadStyle(wb); 
            CellStyle bodyStyle = createBodyStyle(wb); 
            FileOutputStream os = new FileOutputStream("/Users/apple/Downloads/aa.xls"); 
            SAXBuilder sb = new SAXBuilder(); 
            html = html.replaceAll("
    ", "");
            ByteArrayInputStream is = new ByteArrayInputStream(html.getBytes()); 
            try { 
                Document document = sb.build(is); 
                //获取table节点 
                Element root = document.getRootElement(); 
                //获取tr的list 
                List<Element> children =  root.getChildren();
    
                List<Element> trList = new ArrayList<>();
                List<Element> head = children.get(0).getChildren();
                trList.addAll(head);
    
                List<Element> body = children.get(1).getChildren();
                trList.addAll(body);
    
                //循环创建行 
                for(int i=0;i<trList.size();i++){ 
                    HSSFRow row = sheet.createRow(i); 
                    List<Element> tdList = trList.get(i).getChildren("td"); 
                    //该行td的序号 
                    for(int ii=0;ii< tdList.size();ii++){ 
                        row.createCell(ii); 
                        HSSFCell cell = row.getCell(ii); 
                        //判断是否为表头,使用对应的excel格式 
                        if(i<headNum){ 
                            cell.setCellStyle(headStyle); 
                        }else{ 
                            cell.setCellStyle(bodyStyle); 
                        } 
                        cell.setCellValue(getInnerText(tdList.get(ii))); 
    
                    } 
    
                }
                List<CellRangeAddress> cellArea = getCellArea(trList);
                if(!cellArea.isEmpty()) {
                    for (CellRangeAddress cellRangeAddress : cellArea) {
                        sheet.addMergedRegion(cellRangeAddress);
                    }
                }
    
                wb.write(os); 
            } catch (JDOMException e) { 
                e.printStackTrace(); 
            } catch (IOException e) { 
                e.printStackTrace(); 
            } 
        } 
    
        /**
         * 导出excel表格二维数组:0为文字占用格,1为横向被合并格,2为纵向合并格
         * @param trList
         * @return
         * zyn
         * 2012-12-21 下午1:35:40
         */ 
        private static List<CellRangeAddress> getCellArea(List<Element> trList){ 
            //获取table单元格矩阵 
            Element headtr = trList.get(0); 
            List<Element> headTdList = headtr.getChildren("td"); 
            //每行的未经合并的单元格个数 
            int cols = 0; 
            for(Element e:headTdList){ 
                System.out.println("#"+e.getText()); 
                int colspan = Integer.valueOf(null==e.getAttributeValue("colspan")?"0":e.getAttributeValue("colspan")); 
                if(colspan==0){ 
                    colspan =1; 
                } 
                cols += colspan; 
            } 
            //初始化单元格矩阵 
            int[][] area = new int[trList.size()][cols]; 
            List<CellRangeAddress> cellRangeAddresses = new ArrayList<>();
            Element tr;
            List<Element> tdList;
            Element td;
            int trsize = trList.size();
            int tdsize;
            int colspan;
            int rowspan;
            CellRangeAddress cellRangeAddress;
            for(int row=0;row < trsize;row++){ 
                tr = trList.get(row); 
                tdList = tr.getChildren("td"); 
                tdsize = tdList.size();
                for(int col=0;col<tdsize;col++){ 
                    td = tdList.get(col);
                    colspan = Integer.valueOf(null==td.getAttributeValue("colspan")?"0":td.getAttributeValue("colspan")); 
                    if(colspan==0){ 
                        colspan =1; 
                    }
    
    
                    rowspan = Integer.valueOf(null==td.getAttributeValue("rowspan")?"0":td.getAttributeValue("rowspan")); 
                    if(rowspan==0){ 
                        rowspan = 1; 
                    } 
                    if(rowspan > 1) {
                        cellRangeAddress = new CellRangeAddress(row,row + rowspan - 1 ,col,col );
                        cellRangeAddresses.add(cellRangeAddress);
                    }
    
                    if(colspan > 1) {
                        cellRangeAddress = new CellRangeAddress(row,row ,col,col+colspan - 1 );
                        cellRangeAddresses.add(cellRangeAddress);
                    }
                } 
            } 
            return cellRangeAddresses; 
        } 
    
        /**-
         * 设置表头样式
         * @param wb
         * @return
         */ 
        private static CellStyle createHeadStyle(Workbook wb){ 
            CellStyle style = wb.createCellStyle(); 
            Font headerFont = wb.createFont(); 
            headerFont.setBold(true);
            style.setAlignment(HorizontalAlignment.CENTER); 
            style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex()); 
            style.setFillPattern(FillPatternType.SOLID_FOREGROUND); 
            style.setFont(headerFont); 
    
            style.setBorderRight(BorderStyle.THIN); 
            style.setRightBorderColor(IndexedColors.BLACK.getIndex()); 
            style.setBorderBottom(BorderStyle.THIN); 
            style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); 
            style.setBorderLeft(BorderStyle.THIN); 
            style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); 
            style.setBorderTop(BorderStyle.THIN); 
            style.setTopBorderColor(IndexedColors.BLACK.getIndex()); 
            return style; 
        } 
    
        /**-
         * 设置表单记录样式
         * @param wb
         * @return
         */ 
        private static CellStyle createBodyStyle(Workbook wb){ 
            CellStyle style = wb.createCellStyle(); 
            Font headerFont = wb.createFont(); 
            headerFont.setBold(true); 
            style.setAlignment(HorizontalAlignment.CENTER); 
            style.setFillForegroundColor(IndexedColors.LIGHT_GREEN.getIndex()); 
            style.setFillPattern(FillPatternType.SOLID_FOREGROUND); 
            style.setFont(headerFont); 
    
            style.setBorderRight(BorderStyle.THIN); 
            style.setRightBorderColor(IndexedColors.BLACK.getIndex()); 
            style.setBorderBottom(BorderStyle.THIN); 
            style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); 
            style.setBorderLeft(BorderStyle.THIN); 
            style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); 
            style.setBorderTop(BorderStyle.THIN); 
            style.setTopBorderColor(IndexedColors.BLACK.getIndex()); 
            return style; 
        } 
    
        private static String getInnerText(Element td){ 
            String txt = ""; 
            if(td.getText()==null || td.getText().equals("")){ 
                if(null != td.getChildren()){ 
                    for(int i=0;i<td.getChildren().size();i++){ 
                        Element e = (Element)td.getChildren().get(i); 
                        txt += getInnerText(e); 
                    } 
                } 
            }else{ 
                txt = td.getText(); 
            } 
            return txt; } 
    
    
        public static void main(String[] args) throws FileNotFoundException { 
            TableToExcelUtil.createExcelFormTable("缴费统计", "<table><tr class="titlebg"><td align="center" nowrap="nowrap" rowspan="2" colspan="1">序号</td><td align="center" nowrap="nowrap" rowspan="2" colspan="1">计划</td><td align="center" nowrap="nowrap" rowspan="2" colspan="1">部门名称</td><td align="center" nowrap="nowrap" colspan="6">线上缴费</td><td align="center" nowrap="nowrap" colspan="3">线下缴费</td><td align="center" nowrap="nowrap" rowspan="2" colspan="1">总计</td></tr><tr class="titlebg"><td align="center" nowrap="nowrap">线上总计</td><td align="center" nowrap="nowrap">快钱</td><td align="center" nowrap="nowrap">支付宝</td><td align="center" nowrap="nowrap">平台余款</td><td align="center" nowrap="nowrap">激活卡</td><td align="center" nowrap="nowrap">其他</td><td align="center" nowrap="nowrap">线下总计</td><td align="center" nowrap="nowrap">本地缴费</td><td align="center" nowrap="nowrap">中心收费</td></tr><tr class="whbg" orgPath="01.25.01." planId="9e508516-5409-4b5d-a0d6-f86ba77eb79f" ><td align="center" nowrap="nowrap">1</td><td align="center" nowrap="nowrap">盐城2013年培训计划</td><td align="center" nowrap="nowrap">盐城市</td><td align="center" nowrap="nowrap">0</td><td align="center" nowrap="nowrap">0</td><td align="center" nowrap="nowrap">0</td><td align="center" nowrap="nowrap">0</td><td align="center" nowrap="nowrap">0</td><td align="center" nowrap="nowrap">0</td><td align="center" nowrap="nowrap"><a id="0-12" href="javascript:showDetail('0-12');">3</a></td><td align="center" nowrap="nowrap">0</td><td align="center" nowrap="nowrap">0</td><td align="center" nowrap="nowrap"><a id="0-15" href="javascript:showDetail('0-15');">3</a></td></tr><tr class="whbg" orgPath="all" planId="all"><td align="center"  nowrap="nowrap" colspan="3" >总计</td><td align="center" nowrap="nowrap" >0</td><td align="center" nowrap="nowrap" >0</td><td align="center" nowrap="nowrap" >0</td><td align="center" nowrap="nowrap" >0</td><td align="center" nowrap="nowrap" >0</td><td align="center" nowrap="nowrap" >0</td><td align="center" nowrap="nowrap" ><a id="4-6" href="javascript:showDetail('4-6');">3</a></td><td align="center" nowrap="nowrap" >0</td><td align="center" nowrap="nowrap" >0</td><td align="center" nowrap="nowrap" ><a id="4-9" href="javascript:showDetail('4-9');">3</a></td></tr></table>", 2); 
        } 
    
    } 
  • 相关阅读:
    iframe页面向上获取父级元素
    解决flex布局 做后一行 靠左的问题
    JavaScript Base64 作为文件上传的实例代码解析
    Python中Flask框架SQLALCHEMY_ECHO设置
    #跟着教程学# 5、python的异常
    #跟着教程学# 4、Python流程控制
    #跟着教程学# 3、Python基础 //Maya select和ls命令返回值问题
    #跟着教程学# 2、Maya Developer Kit下载,及 PyCharm关联Maya
    #跟着教程学# 1、Python_文件批量改名
    (转)maya螺旋线脚本(mel)
  • 原文地址:https://www.cnblogs.com/binz/p/12072925.html
Copyright © 2011-2022 走看看