精华内容
下载资源
问答
  • 网上搜索Acey.ExcelX3.2使用资料
  • 需要分析整理成 母工单——一阶工单——二阶工单……形式的树状关系。 思路: 1、读取原始文件,转换成一个个工单的list,以及母工单的list 2、以母工单为根节点,生成描述上下阶关系的树 3、将树按照树的...

    Excel中的数据是按照工单号存储的,且存在如下关系:

    工单——母工单——上阶工单

    需要分析整理成 母工单——一阶工单——二阶工单……形式的树状关系图。

     

    思路:

    1、读取原始文件,转换成一个个工单的list,以及母工单的list

    2、以母工单为根节点,生成描述上下阶关系的树

    3、将树按照树的样子(不过不是从上到下,二是从左往右,左上角是根节点)写入excel

    代码如下:

      首先是树相关的类:

    # 节点类
    class Node:
        def __init__(self, value):
            self.children = []
            self.value = value
    
        def add_child(self, child):
            self.children.append(child)
    # 树类
    class Tree:
        def __init__(self):
            self.root = None
    
        # 生成树
        def gen_tree(self, value, data_list = []):
            self.root = Node(value)
    
            # 递归生成树
            def gen_tree_recursive(node):
                for item in data_list:
                    if item['parent'] == node.value:
                        entry_node = gen_tree_recursive(Node(item['name']))
                        node.add_child(entry_node)
                return node
    
            gen_tree_recursive(self.root)
    

      下面是excel操作相关的类(读写excel使用xlrd和xlwt):

    class Excel:
        def __init__(self, origin_file):
            self.origin_file = origin_file
            self.dest_file = origin_file.split('.xls')[0] + '排产.xls'
            self.workbook = xlwt.Workbook(encoding='utf-8')
    
        #将原始文件转换为列表,核心字段为工单号、母工单、上阶工单
        def origin2list(self):
            # 打开excel文件
            data = xlrd.open_workbook(self.origin_file)
            # 获取第一张工作表(通过索引的方式)
            table = data.sheets()[0]
    
            # 获取母工单,可能有多个,所以为list,元素在表格中的位置按实际情况写
            m_order_all = []
            m_order_all.extend(table.col_values(4))
            m_order_list = []
            for item in m_order_all:
                if item != '' and item != table.col(4)[0].value and {'name': item} not in m_order_list:
                    m_order_list.append({'name': item})
    
            # 获取所有工单
            nrows = table.nrows
            order_all = []
            order_list = []
            for i in range(nrows - 1):
                order_all.append({'name': table.cell(i + 1, 2).value, 'parent': table.cell(i + 1, 5).value})
            for item in order_all:
                if item not in order_list:
                    order_list.append(item)
            # 返回母工单、所有工单列表
            return m_order_list, order_list
    
        # 将树按照格式写入excel文件
        def tree2excel(self, tree):
            # 增加一个sheet, 命名为root节点名
            table = self.workbook.add_sheet(tree.root.value)
    
            # 递归写入表格
            def write_recursive(node, table, r, c):
                global rnum  #此处用了个全局变量,在开头声明
                table.write(r, c, node.value)
                if len(node.children) == 0:
                    rnum = rnum + 1
                else:
                    for child in node.children:
                        write_recursive(child, table, rnum, c + 1)
    
            write_recursive(tree.root, table, rnum, 0)
            # 保存
            self.workbook.save(self.dest_file)
    
        # 分析原始数据、并写入目标excel
        def data_analysis(self):
            root_list, order_list = self.origin2list()
            for item in root_list:
                tree = Tree()
                tree.gen_tree(item['name'], order_list)
                self.tree2excel(tree)

      调用:

    if __name__ == '__main__':
       excel = Excel('../1.项目/0102工单.xls')
       excel.data_analysis()

     

    转载于:https://www.cnblogs.com/duduniya/p/10769406.html

    展开全文
  • poi导出excel

    2019-12-04 15:16:02
    1、根据excel模板导出excel,sheet页数固定,标题固定,需要生成折线图、树状图等【根据隐藏sheet页存放数据实现】 2、前端js生成excel文件传会后端修改样式【需同时参考另一篇博客:js导出excel】 相关资源: ...

    目录

    需求:

    1、根据excel模板导出excel,sheet页数固定,标题固定,需要生成折线图、树状图等【根据隐藏sheet页存放数据实现】

    2、前端js生成excel文件传会后端修改样式【需同时参考另一篇博客:js导出excel】

    相关资源:

    相关博客:

    需要注意的

    1、无法加载到资源:

    2、异常Your InputStream was neither an OLE2 stream, nor an OOXML stream

    代码相关

    需求1:根据模板导出

    1、service调用层代码:

    2、导出模板ExcelUtils :【需求1需求2共用】

    需求2:js根据table生成excel对象传回后端


     

    需求:

    1、根据excel模板导出excel,sheet页数固定,标题固定,需要生成折线图、树状图等【根据隐藏sheet页存放数据实现】

    2、前端js生成excel文件传会后端修改样式【需同时参考另一篇博客:js导出excel

    相关资源:

    excel模板下载:https://pan.baidu.com/s/1y_YBMUdY8LEX811CJKhTog

    导出excel样例下载:https://pan.baidu.com/s/1H2pkoq8SHG3TNAEXkjcfYA

    ExcelUtils代码下载【poi版本3.11】:https://pan.baidu.com/s/19dTxNbRD6NIDsl5OEazTsg

    调用导出代码下载:https://pan.baidu.com/s/1yIoyoSO71SOHfMCBe1ieRA

    相关博客:

    折线图系列值不能添加公式,应该使用定义名称的方式解决:http://www.exceloffice.net/archives/2689

    excel动态获取数据源方法:http://www.360doc.com/content/18/0123/12/28740943_724398529.shtml

    POI工厂类型获取WorkBook对象:https://www.jianshu.com/p/d64f7231411a?utm_source=oschina-app

    【WorkbookFactory.create(inputStream)】

    导出指定格式的excel:https://blog.csdn.net/sinat_33151213/article/details/78405187

    指定resource文件:https://www.cnblogs.com/whalesea/p/11677657.html

    需要注意的

    1、无法加载到资源:

    /**
         * 根据模板文件创建临时文件
         * @param fileName  模板文件名
         * @return 临时文件
         */
        public static File getFileFromTemplate(String fileName) throws IOException {
            // 获得模板文件
            ClassPathResource classPathResource = new ClassPathResource(fileName);
            InputStream inputStream = classPathResource.getInputStream();
            // 根据模板文件创建临时文件
            File file = File.createTempFile(fileName.substring(0, fileName.indexOf('.')), fileName.substring(fileName.indexOf('.')));
            FileUtils.copyInputStreamToFile(inputStream, file);
            IOUtils.closeQuietly(inputStream);
            return file;
        }

    2、异常Your InputStream was neither an OLE2 stream, nor an OOXML stream

    指定maven不编译xls、xlsx文件【Your InputStream was neither an OLE2 stream, nor an OOXML stream】:https://blog.csdn.net/mlsama/article/details/89709966

        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-resources-plugin</artifactId>
                    <configuration>
                        <nonFilteredFileExtensions>
                            <nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
                            <nonFilteredFileExtension>xls</nonFilteredFileExtension>
                            <nonFilteredFileExtension>woff2</nonFilteredFileExtension>
                            <nonFilteredFileExtension>woff</nonFilteredFileExtension>
                            <nonFilteredFileExtension>ttf</nonFilteredFileExtension>
                        </nonFilteredFileExtensions>
                    </configuration>
                </plugin>
            </plugins>
        </build>

    只有resources文件夹下面的资源会默认被编译,xls、xlsx被编译,并且该项配置会导致webapp下面的文件被编译

    代码相关

    需求1:根据模板导出

    1、service调用层代码:

    /**
          *根据模板导出excel
          */	
        @Override
        public void exportAll(String fileName, InvestmentAnalysisDto dto, HttpServletRequest request, HttpServletResponse response) throws Exception {
            ExcelUtils excelUtils = new ExcelUtils();
    
            // 数据集合【每一个ExcelUtils.ParaMap 对应一个Sheet页】
            // ExcelUtils.ParaMap的构造函数 【数据开始填充的行号、数据开始填充的列号、sheet名字、数据集List、数据类型class、 ... 加粗行的get方法、】
            List<ExcelUtils.ParaMap> list = new ArrayList<>();
    
            List<InvestmentAnalysis> investManage = queryInvestmentManageInfo(dto);// 投资分析-投资基本管理
            List<InvestmentAnalysis> scaleOverview = queryScaleOverviewInfo(dto);  // 投资分析-规模概览
            Map<String, List<InvestmentAnalysis>> returnInvestmentManagement = queryReturnInvestmentManagement(dto);// 投资分析-投资管理收益率
            Map<String, List<InvestmentAnalysis>> distributionOfYield = queryDistributionOfYield(dto);              // 投资分析-收益率分布情况
            Map<String, List<InvestmentAnalysis>> tenAccountsBeforeAndAfter = queryTenAccountsBeforeAndAfter(dto);  // 投资分析-前后十账户
            List<InvestmentAnalysis> keyCombination = queryKeyCombination(dto);         // 投资分析-重点组合
            List<InvestmentAnalysis> crisisCombination = queryCrisisCombination(dto);   // 投资分析-危机组合
            List<InvestmentAnalysis> accountDetails = queryAccountDetails(dto);         // 投资分析-账户明细
            List<InvestmentAnalysis> competitiveAccount = queryCompetitiveAccount(dto); // 投资分析-竞争账户
    
            // 投资基本管理
            ExcelUtils.ParaMap paraMap1 = excelUtils.new ParaMap(1,1, "投资管理基本情况", investManage, InvestmentAnalysis.class, "getType", "合计");
            list.add(paraMap1);
    
            // 规模概览
            List<InvestmentAnalysis> enterAnn = scaleOverview.stream().filter(obj -> obj.getType().equals("企业年金")).collect(Collectors.toList());
            ExcelUtils.ParaMap paraMap2 = excelUtils.new ParaMap(1,0, "规模概览-数据", enterAnn, InvestmentAnalysis.class);
            list.add(paraMap2);   // 企业年金
            List<InvestmentAnalysis> ocupaAnn = scaleOverview.stream().filter(obj -> obj.getType().equals("职业年金")).collect(Collectors.toList());
            ExcelUtils.ParaMap paraMap3 = excelUtils.new ParaMap(1,3, "规模概览-数据", ocupaAnn, InvestmentAnalysis.class);
            list.add(paraMap3);   // 职业年金
            List<InvestmentAnalysis> oldPension = scaleOverview.stream().filter(obj -> obj.getType().equals("养老金产品")).collect(Collectors.toList());
            ExcelUtils.ParaMap paraMap4 = excelUtils.new ParaMap(1,5, "规模概览-数据", oldPension, InvestmentAnalysis.class);
            list.add(paraMap4);   // 养老金产品
    
            // 投资管理收益率-年金投资收益率
            List<InvestmentAnalysis> annuityInvestment = returnInvestmentManagement.get("annuityInvestment");
            List<InvestmentAnalysis> annInvest = annuityInvestment.stream().filter(obj -> obj.getFundGroup1().equals("企业年金-固定")).collect(Collectors.toList());
            ExcelUtils.ParaMap paraMap5 = excelUtils.new ParaMap(1,0, "年金投资收益率-数据", annInvest, InvestmentAnalysis.class);
            list.add(paraMap5);   // 年金投资收益率-企业年金-固定
            List<InvestmentAnalysis> ann2Invest = annuityInvestment.stream().filter(obj -> obj.getFundGroup1().equals("企业年金-含权")).collect(Collectors.toList());
            ExcelUtils.ParaMap paraMap6 = excelUtils.new ParaMap(1,3, "年金投资收益率-数据", ann2Invest, InvestmentAnalysis.class);
            list.add(paraMap6);   // 年金投资收益率-企业年金-含权
            List<InvestmentAnalysis> occInvest = annuityInvestment.stream().filter(obj -> obj.getFundGroup1().equals("职业年金-含权")).collect(Collectors.toList());
            ExcelUtils.ParaMap paraMap7 = excelUtils.new ParaMap(1,5, "年金投资收益率-数据", occInvest, InvestmentAnalysis.class);
            list.add(paraMap7);   // 年金投资收益率-职业年金-含权
    
            // 投资管理收益率
            List<InvestmentAnalysis> enterAnnuityOne = returnInvestmentManagement.get("enterAnnuityOne");
            ExcelUtils.ParaMap paraMap8 = excelUtils.new ParaMap(2,2, "投资管理收益率", enterAnnuityOne, InvestmentAnalysis.class, "getFundType", "合计");
            list.add(paraMap8);   // 投资管理收益率-企业年金(一级组合类型)
            List<InvestmentAnalysis> enterAnnuityTwo = returnInvestmentManagement.get("enterAnnuityTwo");
            ExcelUtils.ParaMap paraMap9 = excelUtils.new ParaMap(13,2, "投资管理收益率", enterAnnuityTwo, InvestmentAnalysis.class, "getFundGroup2", "合计");
            list.add(paraMap9);   // 投资管理收益率-企业年金(二级组合类型)
            List<InvestmentAnalysis> OccupAnnuity = returnInvestmentManagement.get("OccupAnnuity");
            ExcelUtils.ParaMap paraMap10 = excelUtils.new ParaMap(24,0, "投资管理收益率", OccupAnnuity, InvestmentAnalysis.class);
            list.add(paraMap10);  // 投资管理收益率-职业年金
    
            // 收益率分布情况
            List<InvestmentAnalysis> fixedIncome = distributionOfYield.get("fixedIncome");
            ExcelUtils.ParaMap paraMap11 = excelUtils.new ParaMap(2,0, "收益率分布情况", fixedIncome, InvestmentAnalysis.class, "getRankTypemx", "合计");
            list.add(paraMap11);   // 收益率分布情况-固定收益率
            List<InvestmentAnalysis> rightsAndProfit = distributionOfYield.get("rightsAndProfit");
            ExcelUtils.ParaMap paraMap12 = excelUtils.new ParaMap(13,0, "收益率分布情况", rightsAndProfit, InvestmentAnalysis.class, "getRankTypemx", "合计");
            list.add(paraMap12);   // 收益率分布情况-含权益类
    
            // 前后十账户
            List<InvestmentAnalysis> fixedIncomeBefore = tenAccountsBeforeAndAfter.get("fixedIncomeBefore");
            ExcelUtils.ParaMap paraMap13 = excelUtils.new ParaMap(2,0, "前后十账户", fixedIncomeBefore, InvestmentAnalysis.class);
            list.add(paraMap13);   // 前后十账户-固收前十
            List<InvestmentAnalysis> fixedIncomeAfter = tenAccountsBeforeAndAfter.get("fixedIncomeAfter");
            ExcelUtils.ParaMap paraMap14 = excelUtils.new ParaMap(15,0, "前后十账户", fixedIncomeAfter, InvestmentAnalysis.class);
            list.add(paraMap14);   // 前后十账户-固收后十
            List<InvestmentAnalysis> rightBefore = tenAccountsBeforeAndAfter.get("rightBefore");
            ExcelUtils.ParaMap paraMap15 = excelUtils.new ParaMap(28,0, "前后十账户", rightBefore, InvestmentAnalysis.class);
            list.add(paraMap15);   // 前后十账户-权益前十
            List<InvestmentAnalysis> rightAfter = tenAccountsBeforeAndAfter.get("rightAfter");
            ExcelUtils.ParaMap paraMap16 = excelUtils.new ParaMap(41,0, "前后十账户", rightAfter, InvestmentAnalysis.class);
            list.add(paraMap16);   // 前后十账户-权益后十
    
            // 重点组合
            ExcelUtils.ParaMap paraMap17 = excelUtils.new ParaMap(1,0, "重点组合", keyCombination, InvestmentAnalysis.class);
            list.add(paraMap17);
    
            // 危机组合
            ExcelUtils.ParaMap paraMap18 = excelUtils.new ParaMap(1,0, "危机组合", crisisCombination, InvestmentAnalysis.class);
            list.add(paraMap18);
    
            // 账户明细
            ExcelUtils.ParaMap paraMap19 = excelUtils.new ParaMap(1,0, "账户明细", accountDetails, InvestmentAnalysis.class);
            list.add(paraMap19);
    
            // 竞争账户
            ExcelUtils.ParaMap paraMap20 = excelUtils.new ParaMap(1,0, "竞争账户-数据", competitiveAccount, InvestmentAnalysis.class);
            list.add(paraMap20);    // 竞争账户-数据
    	
    	// 数据集交给excelUtils处理,根据模板生成excel文件
            excelUtils.exportExcel(fileName.substring(0, fileName.indexOf(".")) + dto.getStartDate() + "-" + dto.getdDate() + fileName.substring(fileName.indexOf(".")), fileName, request, response, list);
        }
    

    2、导出模板ExcelUtils :【需求1需求2共用】

    import org.apache.commons.io.FileUtils;
    import org.apache.commons.io.IOUtils;
    import org.apache.poi.ss.usermodel.*;
    import org.springframework.core.io.ClassPathResource;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.*;
    import java.util.*;
    
    /**
     * 模板定义【方法名、数值类型、是否需要千分位】
     * 例:getProfit,double,THOUS_BIT 需要千分位且右对齐
     * 例:getCunt,double             不用千分位右对齐
     * 例:ORDER_NUM,int              该列使用自增序号且居中
     * int、String:居中, double:右对齐
     * @author wan
     * @date 2019/12/5 0005 上午 9:38
     * @Version 1.0
     */
    public class ExcelUtils {
    
        public static final String DATA_LIST= "DATA_LIST";          // 数据集合
        public static final String DATA_CLASS= "DATA_CLASS";        // 数据类型
        public static final String INIT_ROWNUM= "INIT_ROWNUM";      // 开始填充数据行号
        public static final String INIT_CELLNUM = "INIT_CELLNUM";   // 开始填充数据列号
        public static final String SHEET_NAME = "SHEET_NAME";       // sheetName
        public static final String ORDER_NUM= "ORDER_NUM";          // 序号列
        public static final String BOLD_FIELD = "BOLD_FIELD";       // 加粗行 "getFieldName","合计","getFieldName2","合计",
        public static final String THOUS_BIT = "THOUS_BIT";         // 千分位
    
        private static short THOUS_BIT_SHORT = 0;       // 千分位格式
        private static Boolean ORDER_NUM_FLAG = false;  // 是否需要序号
        private static Boolean BOLD_IS_FLAG = false;    // 是否加粗
        private static CellStyle[][][][] styles = new CellStyle[2][2][2][2];
    
        /**
         * 初始化CellStyle数组,以供重复使用,每个单元格重新创建严重影响性能
         * @param workbook
         */
        private void init(Workbook workbook){
            THOUS_BIT_SHORT = workbook.createDataFormat().getFormat("#,##0.00");
            // 加粗Font【createNormalStyle设置了普通格式的Font,如果需要加粗则需重新设置setFont(fontBold)】
            Font fontBold = this.createNormalFont(workbook);
            fontBold.setBoldweight(Font.BOLDWEIGHT_BOLD);   // 粗体显示
    
            CellStyle lemon = this.createNormalStyle(workbook);
            lemon.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());// 柠檬色
            lemon.setFillPattern(CellStyle.SOLID_FOREGROUND);
            styles[0][1][1][1] = lemon;
    
            CellStyle white = this.createNormalStyle(workbook);
            white.setFillForegroundColor(IndexedColors.WHITE.getIndex());// 白色
            white.setFillPattern(CellStyle.SOLID_FOREGROUND);
            styles[1][1][1][1] = white;
    
            CellStyle lemonBold = this.createNormalStyle(workbook);   // 柠檬色加粗
            lemonBold.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());// 柠檬色
            lemonBold.setFillPattern(CellStyle.SOLID_FOREGROUND);
            lemonBold.setFont(fontBold);   // 加粗
            styles[0][0][1][1] = lemonBold;
    
            CellStyle whiteBold = this.createNormalStyle(workbook);   // 白色加粗
            whiteBold.setFillForegroundColor(IndexedColors.WHITE.getIndex());// 白色
            whiteBold.setFillPattern(CellStyle.SOLID_FOREGROUND);
            whiteBold.setFont(fontBold);   // 加粗
            styles[1][0][1][1] = whiteBold;
    
            CellStyle lemonThous = this.createNormalStyle(workbook);   // 柠檬色千分位
            lemonThous.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());// 柠檬色
            lemonThous.setFillPattern(CellStyle.SOLID_FOREGROUND);
            lemonThous.setDataFormat(THOUS_BIT_SHORT);   // 千分位
            styles[0][1][0][1] = lemonThous;
    
            CellStyle whiteThous = this.createNormalStyle(workbook);   // 白色千分位
            whiteThous.setFillForegroundColor(IndexedColors.WHITE.getIndex());// 白色
            whiteThous.setFillPattern(CellStyle.SOLID_FOREGROUND);
            whiteThous.setDataFormat(THOUS_BIT_SHORT);   // 千分位
            styles[1][1][0][1] = whiteThous;
    
            CellStyle lemonRight = this.createNormalStyle(workbook);   // 柠檬色右对齐
            lemonRight.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());// 柠檬色
            lemonRight.setFillPattern(CellStyle.SOLID_FOREGROUND);
            lemonRight.setAlignment(CellStyle.ALIGN_RIGHT); // 右对齐
            styles[0][1][1][0] = lemonRight;
    
            CellStyle whiteRight = this.createNormalStyle(workbook);   // 白色右对齐
            whiteRight.setFillForegroundColor(IndexedColors.WHITE.getIndex());// 白色
            whiteRight.setFillPattern(CellStyle.SOLID_FOREGROUND);
            whiteRight.setAlignment(CellStyle.ALIGN_RIGHT); // 右对齐
            styles[1][1][1][0] = whiteRight;
    
            CellStyle lemonBoldThous = this.createNormalStyle(workbook);     // 柠檬色加粗千分位
            lemonBoldThous.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());// 柠檬色
            lemonBoldThous.setFillPattern(CellStyle.SOLID_FOREGROUND);
            lemonBoldThous.setFont(fontBold);                 // 加粗
            lemonBoldThous.setDataFormat(THOUS_BIT_SHORT);    // 千分位
            styles[0][0][0][1] = lemonBoldThous;
    
            CellStyle whiteBoldThous = this.createNormalStyle(workbook);     // 白色加粗千分位
            whiteBoldThous.setFillForegroundColor(IndexedColors.WHITE.getIndex());// 白色
            whiteBoldThous.setFillPattern(CellStyle.SOLID_FOREGROUND);
            whiteBoldThous.setFont(fontBold);                 // 加粗
            whiteBoldThous.setDataFormat(THOUS_BIT_SHORT);    // 千分位
            styles[1][0][0][1] = whiteBoldThous;
    
            CellStyle lemonBoldRight = this.createNormalStyle(workbook);     // 柠檬色加粗右对齐
            lemonBoldRight.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());// 柠檬色
            lemonBoldRight.setFillPattern(CellStyle.SOLID_FOREGROUND);
            lemonBoldRight.setFont(fontBold);                     // 加粗
            lemonBoldRight.setAlignment(CellStyle.ALIGN_RIGHT);   // 右对齐
            styles[0][0][1][0] = lemonBoldRight;
    
            CellStyle whiteBoldRight = this.createNormalStyle(workbook);     // 白色加粗右对齐
            whiteBoldRight.setFillForegroundColor(IndexedColors.WHITE.getIndex());// 白色
            whiteBoldRight.setFillPattern(CellStyle.SOLID_FOREGROUND);
            whiteBoldRight.setFont(fontBold);                     // 加粗
            whiteBoldRight.setAlignment(CellStyle.ALIGN_RIGHT);   // 右对齐
            styles[1][0][1][0] = whiteBoldRight;
    
            CellStyle lemonThousRight = this.createNormalStyle(workbook);     // 柠檬色千分位右对齐
            lemonThousRight.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());// 柠檬色
            lemonThousRight.setFillPattern(CellStyle.SOLID_FOREGROUND);
            lemonThousRight.setDataFormat(THOUS_BIT_SHORT);       // 千分位
            lemonThousRight.setAlignment(CellStyle.ALIGN_RIGHT);  // 右对齐
            styles[0][1][0][0] = lemonThousRight;
    
            CellStyle whiteThousRight = this.createNormalStyle(workbook);     // 白色千分位右对齐
            whiteThousRight.setFillForegroundColor(IndexedColors.WHITE.getIndex());// 白色
            whiteThousRight.setFillPattern(CellStyle.SOLID_FOREGROUND);
            whiteThousRight.setDataFormat(THOUS_BIT_SHORT);       // 千分位
            whiteThousRight.setAlignment(CellStyle.ALIGN_RIGHT);  // 右对齐
            styles[1][1][0][0] = whiteThousRight;
    
            CellStyle lemonBoldThousRight = this.createNormalStyle(workbook);     // 柠檬色加粗千分位右对齐
            lemonBoldThousRight.setFillForegroundColor(IndexedColors.LEMON_CHIFFON.getIndex());// 柠檬色
            lemonBoldThousRight.setFillPattern(CellStyle.SOLID_FOREGROUND);
            lemonBoldThousRight.setFont(fontBold);                 // 加粗
            lemonBoldThousRight.setDataFormat(THOUS_BIT_SHORT);    // 千分位
            lemonBoldThousRight.setAlignment(CellStyle.ALIGN_RIGHT);  // 右对齐
            styles[0][0][0][0] = lemonBoldThousRight;
    
            CellStyle whiteBoldThousRight = this.createNormalStyle(workbook);     // 白色加粗千分位右对齐
            whiteBoldThousRight.setFillForegroundColor(IndexedColors.WHITE.getIndex());// 白色
            whiteBoldThousRight.setFillPattern(CellStyle.SOLID_FOREGROUND);
            whiteBoldThousRight.setFont(fontBold);                 // 加粗
            whiteBoldThousRight.setDataFormat(THOUS_BIT_SHORT);    // 千分位
            whiteBoldThousRight.setAlignment(CellStyle.ALIGN_RIGHT);  // 右对齐
            styles[1][0][0][0] = whiteBoldThousRight;
        }
    
        /**
         * 初始化标识参数【调优字段,加快for循环中的if判断,短路】
         */
        private void init_flag(){
            ORDER_NUM_FLAG = false;
            BOLD_IS_FLAG = false;
        }
    
        /**
         * 设置普通格式Font【微软雅黑、size:10】
         * @param workbook
         * @return
         */
        private Font createNormalFont(Workbook workbook) {
            Font font = workbook.createFont();
            font.setFontName("微软雅黑");
            font.setFontHeightInPoints((short) 10);
            return font;
        }
    
        /**
         * 设置普通格式样式【边框、边框颜色、普通格式Font】
         * @param workbook
         * @return
         */
        private CellStyle createNormalStyle(Workbook workbook) {
            CellStyle style = workbook.createCellStyle();
            style.setWrapText(true);
            // 设置水平对齐的样式为居中对齐;
            style.setAlignment(CellStyle.ALIGN_CENTER);
            // 设置垂直对齐的样式为居中对齐;
            style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
            // 设置边框
            style.setBorderBottom(CellStyle.BORDER_THIN);   // 下边框
            style.setBorderLeft(CellStyle.BORDER_THIN);     // 左边框
            style.setBorderTop(CellStyle.BORDER_THIN);      // 上边框
            style.setBorderRight(CellStyle.BORDER_THIN);    // 右边框
            style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());  // 设置底边颜色
            style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());    // 设置左边颜色
            style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());   // 设置右边颜色
            style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());     // 设置顶边颜色
            style.setFont(this.createNormalFont(workbook));      // 设置普通格式的Font
            return style;
        }
    
        /**
         * 根据模板导出excel
         * @param fileName          导出的excel名字
         * @param templateFileName  临时模板文件名
         * @param list              集合数据【一个元素代表一个sheet页】
         */
        public void exportExcel(String fileName, String templateFileName,
                                HttpServletRequest request, HttpServletResponse response,
                                List<Object> list) throws Exception {
            // 根据模板名查找模板【resource下】并创建临时文件返回
            File newFile = ExcelUtils.getFileFromTemplate(templateFileName);
            // 根据临时文件输入流获取工作簿
            Workbook workbook = WorkbookFactory.create(new FileInputStream(newFile));
            // 初始化工作簿
            this.init(workbook);
            // 获取文件输出流
            FileOutputStream fos = new FileOutputStream(newFile);
            // 编辑工作簿
            for (int i = 0; i < list.size(); i++) {
                init_flag();// 初始化参数
                this.fillDataToTemplate(workbook, (Map<String, Object>)list.get(i));
            }
            // 工作簿写入输出流
            workbook.write(fos);
            fos.flush();
            IOUtils.closeQuietly(fos);
    
            // 下载
            // 设置response头信息
            this.setDownloadHeader(request, response, fileName, newFile.length());
            // 将该临时文件写入response流
            OutputStream out = response.getOutputStream();
            FileInputStream in = new FileInputStream(newFile);
            byte[] b = new byte[1024];
            int len;
            while((len = in.read(b)) > -1) {
                out.write(b, 0, len);
            }
            out.flush();
            IOUtils.closeQuietly(out);
    
            // 删除临时文件
            this.deleteFile(newFile);
        }
    
        /**
         * 特定样式导出excel【无模板,由前端FormData包装的blob对象传给后端 用MultipartFile接收】
         * @param fname   文件名
         * @param is      文件流
         * @param gsCells 固收最末列
         * @param qyCells 权益最末列
         */
        public void exportExcelAggInvAna(String fname, InputStream is, Integer gsCells, Integer qyCells, HttpServletRequest request, HttpServletResponse response) throws Exception {
            // 根据流创建临时文件
            File newFile = File.createTempFile(fname.substring(0, fname.indexOf('.')), fname.substring(fname.indexOf('.')));
            // 将流内容写入该临时文件
            FileUtils.copyInputStreamToFile(is, newFile);
    
            // 根据file文件获取workbook
            Workbook workbook = WorkbookFactory.create(new FileInputStream(newFile));
            init(workbook); // 初始化
    
            // 获取sheet数,循环sheet
            int numberOfSheets = workbook.getNumberOfSheets();
            for (int i = 0; i < numberOfSheets; i++) {
                int numberOfCells = i == 0 ? gsCells : qyCells;
                Sheet sheet = workbook.getSheetAt(i);
                sheet.setDisplayGridlines(false);// 取消显示网格线
                // 获取sheet的总行数,循环行
                int numberOfRows = sheet.getLastRowNum() + 1;
                for (int j = 0; j < numberOfRows; j++) {
                    Row row = sheet.getRow(j);
                    if (row == null) {
                        row = sheet.createRow(j);
                    }
                    if (j == 27) { // 设置行高【该行需要伸展高度】
                        row.setHeightInPoints(34);//【需要整行设置】
                    }
                    // 循环列【列由前端传回,因为有合并项,所以无法确定最后一列的下标,样式调整时可能导致边框颜色无法设置】
                    for (int k = 0; k < numberOfCells; k++) {
                        Cell cell = row.getCell(k);
                        if (cell == null) {
                            cell = row.createCell(k);
                        }
                        // 数值部分【右对齐】
                        if (j > 1 && k > 6) {
                            cell.setCellStyle(chooseStyle(j % 2, false, false, true));
                            if (k > 8 && k % 3 == 0) {
                                cell.setCellStyle(chooseStyle(0, false, false, true));
                            }
                        }else { // 标题部分【加粗、居中】
                            cell.setCellStyle(chooseStyle(j % 2, true, false, false));
                            if (k == 0 || (j == 11 && k == 2)) {
                                cell.setCellStyle(chooseStyle(0, true, false, false));
                            }
                        }
                    }
                }
            }
            // 获取临时文件输出流
            FileOutputStream fos = new FileOutputStream(newFile);
            // 模板写入文件
            workbook.write(fos);
            fos.flush();
            IOUtils.closeQuietly(fos);
    
            // 设置response头信息
            this.setDownloadHeader(request, response, fname, newFile.length());
            // 将文件写入response的输出流
            OutputStream out = response.getOutputStream();
            FileInputStream in = new FileInputStream(newFile);
            byte[] b = new byte[1024];
            int len;
            while((len = in.read(b)) > -1) {
                out.write(b, 0, len);
            }
            out.flush();
            IOUtils.closeQuietly(out);
            // 删除创建的新文件
            this.deleteFile(newFile);
        }
    
        /**
         * 根据模板填充excel
         */
        public <E> void fillDataToTemplate(Workbook workbook, Map<String, Object> map) throws Exception {
            fillDataToTemplate(workbook, map.get(SHEET_NAME) == null ? "" : map.get(SHEET_NAME).toString(), map);
        }
        /**
         * 根据模板填充excel
         * @param workbook  模板excel
         * @param sheetName sheet名
         * @param map       导出相关配置map
         */
        public <E> void fillDataToTemplate(Workbook workbook, String sheetName, Map<String, Object> map) throws Exception {
            // 填充的数据类型
            Class clz = (Class) map.get(DATA_CLASS);
            // 开始填充数据的行下标
            int rownum = (int) map.get(INIT_ROWNUM);
            // 开始填充数据的列下标
            int cellnum = (int) map.get(INIT_CELLNUM);
            // 填充的数据集
            List<E> objs = (List<E>) map.get(DATA_LIST);
            Sheet sheet = null;
            if (sheetName == null || sheetName == "") {
                 throw new Exception();
            }else {
                sheet = workbook.getSheet(sheetName);
                if (sheet == null) {
                    sheet = workbook.createSheet(sheetName);
                }
            }
            // get方法名,模板中定义【没有直接获取Method对象,因为要配合序号使用,序号列的value会存入ORDER_NUM】
            TreeMap<Integer, String> methodMap = new TreeMap();
            // excel类型,模板中定义【STRING、INT:居中,DOUBLE:右对齐】
            TreeMap<Integer, String> typedMap = new TreeMap();
            // 是否需要千分位【THOUS_BIT】
            TreeMap<Integer, String> thoudsBitMap = new TreeMap();
    
            // 根据起始行下标获取row
            Row sheetRow = sheet.getRow(rownum);
            int cellField = cellnum;
            for (int count = 0; true; cellField++, count++) {// 如果excel没有END则会出现空指针异常
                // 根据起始行、起始列获取cellValue
                String value = sheetRow.getCell(cellField).toString();
                // 是否为序号列
                if (value.contains(ORDER_NUM)) {
                    ORDER_NUM_FLAG = true;  // 将排序字段标识符设为true
                    methodMap.put(count, ORDER_NUM);    // 如果excel没有END则会出现空指针异常
                    // 这里给序号也设置了type,所以序号也可以右对齐
                    typedMap.put(count, value.substring(value.indexOf(',') + 1));// 如果excel没有END则会出现空指针异常
                    continue;
                }
                if ("END".equals(value)) {
                    break;
                }
                List<String> strs = Arrays.asList(value.split(","));
                methodMap.put(count, strs.get(0));      // 如果excel没有END则会出现空指针异常
                typedMap.put(count, strs.get(1));       // 如果excel没有END则会出现空指针异常
                if (value.contains(THOUS_BIT)) {        // 包含千分位,将需要千分位的
                    thoudsBitMap.put(count, strs.get(0));   // 将需要千分位的字段,将getField方法名放进去
                }
            }
            sheetRow.getCell(cellField).setCellValue("");// 将END置空
    
            Row row = null;
            Cell cell = null;
            String type = "";
            if (objs != null && objs.size() > 0) {
                Map<String, String> boldMap = (Map<String, String>)map.get(BOLD_FIELD);
                if (boldMap != null && boldMap.size() > 0) {
                    BOLD_IS_FLAG = true;    // 将加粗标识符设为true
                }
                // 一个元素是一行
                for (int i = 0; i < objs.size(); i++) {
                    E obj = objs.get(i);
                    row = sheet.getRow(i + rownum) == null ? sheet.createRow(i + rownum) : sheet.getRow(i + rownum);
                    // 当前行是否加粗【行级样式】
                    boolean rowBoldFlag = false;
                    if (BOLD_IS_FLAG) {
                        for (Map.Entry<String, String> entry : boldMap.entrySet()) {
                            // 反射获得该元素的该字段,是否等于标识为需要加粗的值,例如"合计"
                            if (entry.getValue().equals(clz.getDeclaredMethod(entry.getKey()).invoke(obj))) {
                                rowBoldFlag = true;
                                break;
                            }
                        }
                    }
                    // 元素属性循环
                    for (int j = 0; j < methodMap.size(); j++) {
                        boolean cellThousFlag = false;  // 千分位标识
                        boolean cellRightFlag = false;  // 右对齐标识
                        type = typedMap.get(j).toUpperCase(); // 数值类型
                        cell = row.createCell(j + cellnum);
                        String methodName = methodMap.get(j);   // 获取方法名
                        // 当前单元格是否需要千分位
                        if (methodName.equals(thoudsBitMap.get(j))) {
                            cellThousFlag = true;
                        }
                        // 所有DOUBLE默认右对齐
                        if ("DOUBLE".equals(type)) {
                            cellRightFlag = true;
                        }
                        cell.setCellStyle(chooseStyle(i % 2, rowBoldFlag, cellThousFlag, cellRightFlag));// 【背景色_加粗_千分位_右对齐】
                        // 设置cellValue值
                        if (ORDER_NUM_FLAG && ORDER_NUM.equals(methodName)){  // 如果包含序号则直接将i为其设置
                            cell.setCellValue(i + 1);
                            continue;
                        }
                        Object value = clz.getDeclaredMethod(methodName).invoke(obj);
                        if (value == null) {
                            cell.setCellValue("");
                        }else {
                            switch (type) {
                                case "DOUBLE":
                                    cell.setCellValue(Double.parseDouble(value.toString()));
                                    break;
                                case "INT":
                                    cell.setCellValue(Integer.parseInt(value.toString()));
                                    break;
                                case "STRING":
                                    cell.setCellValue(value.toString());
                                    break;
                                default:
                                    cell.setCellValue(value.toString());
                                    break;
                            }
                        }
                    }
                }
            }else {
                for (int j = 0; j < methodMap.size(); j++) {// 如果没有数据,将公式清空
                    row = sheet.getRow(rownum) == null ? sheet.createRow(rownum) : sheet.getRow(rownum);
                    row.getCell(j + cellnum).setCellValue("");// 将公式设成空值
                }
            }
        }
    
        /**
         * 获取CellStyle
         * @param i 行号 起始行是0柠檬黄
         * @param rowBoldFlag 加粗
         * @param cellThousFlag 千分位处理
         * @param cellRightFlag 右对齐
         * @return
         */
        private CellStyle chooseStyle(int i, boolean rowBoldFlag, boolean cellThousFlag, boolean cellRightFlag) {
            int colorIndex = i == 0 ? 0 : 1;
            int boldIndex = rowBoldFlag ? 0 : 1;
            int thousIndex = cellThousFlag ? 0 : 1;
            int rightIndex = cellRightFlag ? 0 : 1;
            return styles[colorIndex][boldIndex][thousIndex][rightIndex];
        }
    
        /**
         * 删除文件
         */
        private void deleteFile(File... files) {
            for (File file : files) {
                if (file.exists()) {
                    file.delete();
                }
            }
        }
    
        /**
         * 根据模板文件创建临时文件
         * @param fileName  模板文件名
         * @return 临时文件
         */
        public static File getFileFromTemplate(String fileName) throws IOException {
            // 获得模板文件
            ClassPathResource classPathResource = new ClassPathResource(fileName);
            InputStream inputStream = classPathResource.getInputStream();
            // 根据模板文件创建临时文件
            File file = File.createTempFile(fileName.substring(0, fileName.indexOf('.')), fileName.substring(fileName.indexOf('.')));
            FileUtils.copyInputStreamToFile(inputStream, file);
            IOUtils.closeQuietly(inputStream);
            return file;
        }
    
        /**
         * 设置response头信息
         * @param request
         * @param response
         * @param fileName
         */
        public static void setDownloadHeader(HttpServletRequest request,
                                             HttpServletResponse response,
                                             String fileName, long length) {
            String userAgent = request.getHeader("USER-AGENT").toLowerCase();
            try {
                Object finalFileName = null;
                if (userAgent.contains("webkit")) {
                    finalFileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
                } else if (userAgent.contains("firefox")) {
                    finalFileName = new String(fileName.getBytes("UTF-8"), "ISO8859-1");
                } else {
                    finalFileName = new String(fileName.getBytes("GBK"), "ISO8859-1");
                }
                response.setHeader("Content-Disposition", "attachment; filename=\"" + finalFileName.toString() + "\"");
                response.addHeader("Content-Length", "" + length);
                response.setContentType("text/html;charset=ISO8859-1");
                response.setContentType("application/x-msdownload");
            } catch (UnsupportedEncodingException var5) {
                var5.printStackTrace();
            }
        }
    
        /**
         * 导出数据包装类【一个ParaMap对应一个sheet】
         * @param <E>
         */
        public class ParaMap<E> extends HashMap {
            public ParaMap(){
                super();
            }
            public ParaMap(int rownum, int cellnum, String sheetName, List<E> datas, Class clz, String ...boldStr){
                this();
                HashMap<String, String> map = new HashMap<>();
                for (int i = 0; i < boldStr.length; i = i + 2) {
                    map.put(boldStr[i], boldStr[i + 1]);
                }
                this.put(ExcelUtils.INIT_ROWNUM, rownum);   // 开始填充数据的行下标
                this.put(ExcelUtils.INIT_CELLNUM, cellnum); // 开始填充数据的列下标
                this.put(ExcelUtils.SHEET_NAME, sheetName); // sheetName
                this.put(ExcelUtils.DATA_LIST, datas);      // 数据集合
                this.put(ExcelUtils.DATA_CLASS, clz);       // 数据类型
                this.put(ExcelUtils.BOLD_FIELD, map);       // 加粗行
            }
        }
    }
    

    需求2:js根据table生成excel对象传回后端

    使用:xlsx-style、异步、blob、FormData

    参考另一篇博客:js导出多个sheet的excel文件【xlsx-style,纯前端】

        
        /**
         * 无模板版本导出excel【该版本是通过js生成的excel文件,包装成FormData对象传给后端接收处理样式,后端用MultipartFile 接收FormData对象】
         * 【其中FormData对象包装的"data"是blob对象,可结合js代码理解】
         * @param fname   文件名
         * @param file    FormData包装的blob文件
         * @param gsCells 固收最末列下标
         * @param qyCells 权益最末列下标
         */
        @PostMapping(value = "exportCfgAna")
        @ResponseBody
        public void exportCfgAna(@RequestParam(value = "fname", required = false)String fname,
                                 @RequestParam(value = "data", required = false)MultipartFile file,
                                 @RequestParam(value = "gsCells", required = false)Integer gsCells,
                                 @RequestParam(value = "qyCells", required = false)Integer qyCells,
                                 HttpServletRequest request,
                                 HttpServletResponse response) throws Exception {
            GeneralResult result = new GeneralResult();
            ExcelUtils utils = new ExcelUtils();
            try {
                utils.exportExcelAggInvAna(fname, file.getInputStream(), gsCells, qyCells, request, response);
            } catch (Exception e) {
                result.fail(CodeUtils.CREATE_MODEL_ERROR, e.getMessage());
                e.printStackTrace();
            }
        }

     

    展开全文
  • FDET是一个以树状结构录入数据生成鱼骨的COM加载项软件,支持更快捷的数据录入修改、保存、添加、鼠标操作及鱼骨预览,并可导出保存(视用户使用版本而定:DEMO演示版在功能上是有限制的)。其操作简单、体贴...
  • 自动对高频字段聚类分析,并输出聚类树状图 (Dendrogram)。SATI自动生成 Ucinet, NetDraw, SPSS, 和Dephi等软件使用的源文件。SATI 4.0 网络版 不仅保留了原本桌面版SATI 3.2的所有功能之外,还增加了数据处理和分析...
  • 所以写死了,凑合看吧,画出饼图,树状图生成对应的数据excel,希望大家举一反三能帮助自己分析BUG #__author__ = 'xu.duan' # -*- coding: utf-8 -*- import cairo import pycha.pie import pycha.bar ...

    整体代码比较冗长,但是很好读。写的方法全是按照BUG分类去写的。所以写死了,凑合看吧,画出饼图,树状图和生成对应的数据excel,希望大家举一反三能帮助自己分析BUG

    #__author__ = 'xu.duan'
    # -*- coding: utf-8 -*-
    
    import cairo
    import pycha.pie
    import pycha.bar
    import pycha.scatter
    import pycha.stackedbar
    import pycha.line
    import time
    from redmine import Redmine
    import xlwt
    
    # settings redmine,redmine's url :http://python-redmine.readthedocs.org/
    def set_Redmine():
        REDMINE_URL = 'http://100.69.177.159:3000' #redmine 的地址
        REDMINE_KEY = 'b549cac9132fb3ef8b2d3ed898dfb1f123e641b2f3'#这个是自己redmine的账号
        redmine = Redmine(REDMINE_URL,key=REDMINE_KEY)
        issues = redmine.issue.all(project_id = 'hybrid-navigation',status_id='*',tracker_id=23)
        return issues
    
    #获取multimode的数据
    def hybrid_API_multimode():
        Low = []
        Normal = []
        High =[]
        Urgent =[]
        Immediate = []
        openlist=[]
        colselist =[]
        for i in set_Redmine():
            try:
                if str(i.category) =='hybrid-API-multimode' and str(i.priority) =="Low":
                    Low.append(i)
                elif str(i.category) =='hybrid-API-multimode' and str(i.priority) =="Normal":
                    Normal.append(i)
                elif str(i.category) =='hybrid-API-multimode' and str(i.priority) =="High":
                    High.append(i)
                elif str(i.category) =='hybrid-API-multimode' and str(i.priority) =="Urgent":
                    Urgent.append(i)
                elif str(i.category) =='hybrid-API-multimode' and str(i.priority) =="Immediate":
                    Immediate.append(i)
                if str(i.category) =='hybrid-API-multimode' and str(i.status) == "New":
                    openlist.append(i)
                if str(i.category) =='hybrid-API-multimode' and str(i.status) != "New":
                    colselist.append(i)
            except Exception, e:
                print e
        return len(Low),len(Normal),len(High),len(Urgent),len(Immediate),len(openlist),len(colselist)
    #获取search的数据
    def hybrid_API_serach():
        Low = []
        Normal = []
        High =[]
        Urgent =[]
        Immediate = []
        openl=[]
        colsel =[]
        for i in set_Redmine():
            try:
                if str(i.category) =='hybrid-API-serach' and str(i.priority) =="Low":
                    Low.append(i)
                elif str(i.category) =='hybrid-API-serach' and str(i.priority) =="Normal":
                    Normal.append(i)
                elif str(i.category) =='hybrid-API-serach' and str(i.priority) =="High":
                    High.append(i)
                elif str(i.category) =='hybrid-API-serach' and str(i.priority) =="Urgent":
                    Urgent.append(i)
                elif str(i.category) =='hybrid-API-serach' and str(i.priority) =="Immediate":
                    Immediate.append(i)
                if str(i.category) =='hybrid-API-serach' and str(i.status) =="New":
                    openl.append(i)
                if str(i.category) =='hybrid-API-serach' and str(i.status) !="New":
                    colsel.append(i)
            except Exception, e:
                print e
        return len(Low),len(Normal),len(High),len(Urgent),len(Immediate),len(openl),len(colsel)
    #获取route&traffic的数据
    def hybrid_API_route_traffic():
        Low = []
        Normal = []
        High =[]
        Urgent =[]
        Immediate = []
        openl=[]
        colsel =[]
        for i in set_Redmine():
            try:
                if str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="Low":
                    Low.append(i)
                elif str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="Normal":
                    Normal.append(i)
                elif str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="High":
                    High.append(i)
                elif str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="Urgent":
                    Urgent.append(i)
                elif str(i.category) =='hybrid-API-route&traffic' and str(i.priority) =="Immediate":
                    Immediate.append(i)
                if str(i.category) =='hybrid-API-route&traffic' and str(i.status) =="New":
                    openl.append(i)
                if str(i.category) =='hybrid-API-route&traffic' and str(i.status) !="New":
                    colsel.append(i)
            except Exception, e:
                print e
        return len(Low),len(Normal),len(High),len(Urgent),len(Immediate),len(openl),len(colsel)
    
    #设置画布
    def set_charvalue():
        width,height=600,600
        surface=cairo.ImageSurface(cairo.FORMAT_ARGB32,width,height)
        return surface
    
    #画饼图
    def draw_pie(surface, options, dataSet):
        chart=pycha.pie.PieChart(surface,options)
        chart.addDataset(dataSet)
        chart.render()
        surface.write_to_png('Pie.png')
    
    #垂直直方图
    def draw_vertical_bar(surface, options, dataSet):
        chart=pycha.bar.VerticalBarChart(surface,options)
        chart.addDataset(dataSet)
        chart.render()
        surface.write_to_png('vertical_bar.png')
    
    #垂直水平直方图
    def draw_horizontal_bar(surface, options, dataSet):
        chart = pycha.bar.HorizontalBarChart(surface,options)
        chart.addDataset(dataSet)
        chart.render()
        surface.write_to_png('horizontal_bar.png')
    
    #线图
    def draw_line(surface, options, dataSet):
        chart = pycha.line.LineChart(surface,options)
        chart.addDataset(dataSet)
        chart.render()
        surface.write_to_png('line.png')
    
    #点图
    def draw_scatterplot(surface, options, dataSet):
        chart = pycha.scatter.ScatterplotChart(surface,options)
        chart.addDataset(dataSet)
        chart.render()
        surface.write_to_png('scatterplotChart.png')
    
    #垂直块图
    def draw_stackedverticalbarChar(surface, options, dataSet):
        chart = pycha.stackedbar.StackedVerticalBarChart(surface,options)
        chart.addDataset(dataSet)
        chart.render()
        surface.write_to_png('stackedVerticalBarChart.png')
    
    #垂直块图2
    def draw_stackweekChar(surface, options, dataSet):
        chart = pycha.stackedbar.StackedVerticalBarChart(surface,options)
        chart.addDataset(dataSet)
        chart.render()
        surface.write_to_png('stackweekChar.png')
    
    #水平块图
    def draw_stackedhorizontalbarChart(surface, options, dataSet):
        chart = pycha.stackedbar.StackedHorizontalBarChart(surface,options)
        chart.addDataset(dataSet)
        chart.render()
        surface.write_to_png('stackedhorizontalbarChart.png')
    
    def set_style(name,height,bold=False):
      style = xlwt.XFStyle() # 初始化样式
    
      font = xlwt.Font() # 为样式创建字体
      font.name = name # 'Times New Roman'
      font.bold = bold
      font.color_index = 4
      font.height = height
    
      # borders= xlwt.Borders()
      # borders.left= 6
      # borders.right= 6
      # borders.top= 6
      # borders.bottom= 6
    
      style.font = font
      # style.borders = borders
    
      return style
    if __name__ == '__main__':
        '''
        Function:Hybrid-BUG数据分析图
        Input:redmin
        Output: excel+PNG
        '''
        #分布图数据数据来源
    
    
        mLow,mNormal,mHigh,mUrgent,mImmediate,mopen,mcolse= hybrid_API_multimode()
        sLow,sNormal,sHigh,sUrgent,sImmediate,sopen,scolse= hybrid_API_serach()
        rLow,rNormal,rHigh,rUrgent,rImmediate,ropen,rcolse= hybrid_API_route_traffic()
        #Hybrid-bug 整体严重情况分布图数据
        totaLow = mLow+sLow+rLow
        totalNormal = mNormal+sNormal+rNormal
        totalHigh = mHigh+sNormal+rHigh
        totalUrgent = mUrgent+sUrgent+rUrgent
        totalImmediate= mImmediate+sImmediate+rNormal
        #Hybrid bug 模块状态统计数据
        mtotal = mopen+mcolse
        stotal = sopen+scolse
        rtotal = ropen+rcolse
        #Hybrid bug weekly状态统计数据
        totalopen = mopen+sopen+ropen
        totalcolse = mcolse+scolse+rcolse
        totalC = totalopen+totalcolse
        print sopen,scolse
    
        #画条形图
        dataSet1=(
                 ('open',((0,int("%d"%mopen)),(1,int("%d"%ropen)),(2,int("%d"%sopen)))),
                 ('close',((0,int("%d"%mcolse)),(1,int("%d"%rcolse)),(2,int("%d"%scolse)))),
    
                )
    
        #图像属性定义
        options1={
                    'legend':{'hide':False},
                    'title':'Hybrid bug 模块状态统计',
                    'titleColor':'#0000ff',
                    'titleFont':'字体',
                    #'background':{'chartColor': '#ffffff'},
                    'axis':{
                        'x': {
                    'ticks': [dict(v=0, label='hybrid-API-multimode'),
                              dict(v=1, label='hybrid-API-route&traffic'),
                              dict(v=2, label='hybrid-API-serach'),],
                    'label': 'Items',
                    'labelColor':'#0000C6'
                },
                'y': {
                    'tickCount':8,
                    'label': 'status',
                    'labelColor':'#0000C6'}
                },
                'background': {
                'chartColor': '#ffffff',     #图表背景色
                'baseColor': '#ffffff',      #边框颜色
                'lineColor': '#E0E0E0'       #横线颜色
            },
                'colorScheme': {
                'name': 'fixed',
                'args': {
                    'colors': ['#A42D00', '#227700'], #图表颜色
                },
            },
        }
    
        #画饼图
        dataSet2=(
                 ('Low',((0,int("%d"%totaLow)),(1,int("%d"%totaLow)))),
                 ('Normal',((0,int("%d"%totalNormal)),(1,int("%d"%totalNormal)))),
                 ('High',((0,int("%d"%totalHigh)),(1,int("%d"%totalHigh)))),
                 ('Urgent',((0,int("%d"%totalUrgent)),(1,int("%d"%totalUrgent)))),
                 ('Immediate',((0,int("%d"%totalImmediate)),(1,int("%d"%totalImmediate)))),
    
                )
    
        #图像属性定义
        options2={
                    'legend':{'hide':False},
                    'title':'Hybrid bug 模块状态统计',
                    'titleColor':'#0000ff',
                    'titleFont':'字体',
                    #'background':{'chartColor': '#ffffff'},
                    'axis':{'labelColor':'#FF0088'},
                'background': {
                'chartColor': '#ffffff',     #图表背景色
                'baseColor': '#ffffff',      #边框颜色
                'lineColor': '#E0E0E0'       #横线颜色
            },
                'colorScheme': {
                'name': 'fixed',
                'args': {
                    'colors': ['#FF5511', '#A42D00','#227700','#0066FF','#99FF33'], #图表颜色
                },
            },
    
    
        }
        #画week图
        dataSet3=(
                 ('open',((0,int("%d"%totalopen)),(1,int("%d"%totalopen)),(2,0))),
                 ('close',((0,int("%d"%totalcolse)),(1,int("%d"%totalcolse)),(2,0))),
    
                )
    
        #图像属性定义
        LastWeek = float(time.strftime("%W"+'.5'))-1
        ThisWeek = float(time.strftime("%W"+'.5'))
        NextWeek = float(time.strftime("%W"+'.5'))+1
    
        options3={
                    'legend':{'hide':False},
                    'title':'Hybrid weekly状态统计',
                    'titleColor':'#0000ff',
                    'titleFont':'字体',
                    #'background':{'chartColor': '#ffffff'},
                    'axis':{
                        'x': {
                    'ticks': [dict(v=0, label='%s'%LastWeek),
                              dict(v=1, label='%s'%ThisWeek),
                              dict(v=2, label='%s'%NextWeek),],
                    'label': 'Items',
                    'labelColor':'#0000C6'
                },
                'y': {
                    'tickCount':8,
                    'label': 'status',
                    'labelColor':'#0000C6'}
                },
                'background': {
                'chartColor': '#ffffff',     #图表背景色
                'baseColor': '#ffffff',      #边框颜色
                'lineColor': '#E0E0E0'       #横线颜色
            },
                'colorScheme': {
                'name': 'fixed',
                'args': {
                    'colors': ['#A42D00', '#227700'], #图表颜色
                },
            },
    
    
        }
        surface = set_charvalue()
    
        #根据需要调用不同函数画不同形状的图
        draw_pie(surface, options2, dataSet2)
        #draw_vertical_bar(surface, options, dataSet)
        #draw_horizontal_bar(surface, options, dataSet)
        #draw_scatterplot(surface, options, dataSet)
        draw_stackedverticalbarChar(surface, options1, dataSet1)
        #draw_stackweekChar(surface, options3, dataSet3)
        draw_stackedhorizontalbarChart(surface, options3, dataSet3)
        #draw_pie(surface, options, dataSet)
        f = xlwt.Workbook() #创建工作簿
        #创建sheet1
        sheet1 = f.add_sheet(u'整体严重情况分布图',cell_overwrite_ok=True) #创建sheet2
        row0 = [u'优先级&模块','hybrid-API-multimode','hybrid-API-route&traffic',u'hybrid-API-serach',u'总计']
        column0 = ['Low','Normal','High','Urgent','Immediate',]
        #生成第一行
        for i in range(0,len(row0)):
            sheet1.write(0,i,row0[i],set_style('Times New Roman',220,True))
        #生成第一列
        for i in range(0,len(column0)):
            sheet1.write(i+1,0,column0[i],set_style('Times New Roman',220))
    
        sheet1.write(1,1,mLow),sheet1.write(1,2,rLow),sheet1.write(1,3,sLow),sheet1.write(1,4,totaLow)
        sheet1.write(2,1,mNormal),sheet1.write(2,2,rNormal),sheet1.write(2,3,sNormal),sheet1.write(2,4,totalNormal)
        sheet1.write(3,1,mHigh),sheet1.write(3,2,rHigh),sheet1.write(3,3,sHigh),sheet1.write(3,4,totalHigh)
        sheet1.write(4,1,mUrgent),sheet1.write(4,2,rUrgent),sheet1.write(4,3,sUrgent),sheet1.write(4,4,totalUrgent)
        sheet1.write(5,1,mImmediate),sheet1.write(5,2,rImmediate),sheet1.write(5,3,sImmediate),sheet1.write(5,4,totalImmediate)
    
        sheet2 = f.add_sheet(u'bug模块状态统计',cell_overwrite_ok=True) #创建sheet2
        row0 = [u'模块&状态','OPEN','CLOSE',u'总计']
        column0 = ['hybrid-API-multimode','hybrid-API-route&traffic','hybrid-API-serach']
        #生成第一行
        for i in range(0,len(row0)):
            sheet2.write(0,i,row0[i],set_style('Times New Roman',220,True))
        #生成第一列
        for i in range(0,len(column0)):
            sheet2.write(i+1,0,column0[i],set_style('Times New Roman',220))
        sheet2.write(1,1,mopen),sheet2.write(1,2,mcolse),sheet2.write(1,3,mtotal)
        sheet2.write(2,1,ropen),sheet2.write(2,2,rcolse),sheet2.write(2,3,rtotal)
        sheet2.write(3,1,sopen),sheet2.write(3,2,scolse),sheet2.write(3,3,stotal)
    
        sheet3 = f.add_sheet(u'weekly状态统计',cell_overwrite_ok=True) #创建sheet2
        row0 = [u'总量\周','CW%s'%LastWeek,'CW%s'%ThisWeek,'CW%s'%NextWeek]
        column0 = ['OPEN','CLOSE',u'BUG总量']
        #生成第一行
        for i in range(0,len(row0)):
            sheet3.write(0,i,row0[i],set_style('Times New Roman',220,True))
        #生成第一列
        for i in range(0,len(column0)):
            sheet3.write(i+1,0,column0[i],set_style('Times New Roman',220,True))
        sheet3.write(1,1,totalopen),sheet3.write(1,2,totalopen),sheet3.write(1,3,'')
        sheet3.write(2,1,totalcolse),sheet3.write(2,2,totalcolse),sheet3.write(2,3,'')
        sheet3.write(3,1,totalC),sheet3.write(3,2,totalC),sheet3.write(3,3,'')
    
        #sheet1.write_merge(7,7,2,4,) #合并列单元格
        #sheet1.write_merge(1,2,4,4,) #合并行单元格
        _data =time.strftime("%Y_%m_%d", time.localtime())
        LastWeek1 = float(time.strftime("%W"+'.5'))
        f.save(r'Ninja Project Bug Statistical Analysis Report_CW%s_%s.xls'%(LastWeek,_data))

     

    转载于:https://www.cnblogs.com/BUGU/p/5381957.html

    展开全文
  • ■ 基于设计信息、自动统计、生成用于设计与施工的电子表格文件,包括原理报表、接线报表,报表的格式采用Excel格式。 ■ 支持用户自定义电子表格的格式。 标注功能 ■ 具有多样化的标注格式,简化标注过程,...
  • 实例098 应用Java程序片段动态生成下拉列表 实例099 同一页面中的多表单提交 实例100 在JSP脚本中插入JavaScript代码 实例101 将页面转发到用户登录页面 4.2 JSP内置对象 实例102 获取表单提交的信息 实例103...
  • 实例098 应用Java程序片段动态生成下拉列表 实例099 同一页面中的多表单提交 实例100 在JSP脚本中插入JavaScript代码 实例101 将页面转发到用户登录页面 4.2 JSP内置对象 实例102 获取表单提交的信息 实例103...
  • 一、功能点设计 ...对office文件 word excel ppt 图片 文本文件 上传后,开启线程 自动生成pdf文件,方便预览。 4、文件上传 自动检查文件类型,记录父子关系 5、创建文章、脑图 节点不仅仅

    一、功能点设计

    系统采用java elementui 技术uniapp制作手机端可以支持多端应用

    1、树状结构

    设置左边属性结构同windows 一样的操作习惯降低学习成本,支持基本的右键操作

    2、权限设置

    对节点实施基于角色和用户的权限管理,方便企业文档保密

    3、文件预览(pdf)

    对office文件 word excel ppt 图片 文本文件 上传后,开启线程 自动生成pdf文件,方便预览。

    4、文件上传

    自动检查文件类型,记录父子关系

    5、创建文章、脑图

    节点不仅仅以文件的形式,还以脑图和文章的形式存在,直接网页访问

    5、批量上传

    通过zip文件,自动上传多个文件,并自动解压,支持多级文件夹自动解压成文件节点

    6、节点复制与移动

    文件节点移动和复制 实现深层拷贝

    7、全文索引(lucene)

    上传后自动对标题和内容进行全文索引,程序自动提取word excel pdf ppt 等文本 进行索引

    8、系统管理配置

    系统管理部分的设计

    9、手机端

    手机端主要设置预览和检索功能

     

     

     

     

    todo:

             bug修复 细节完善

             回收站功能、归档功能、

     

    在文档管理系统中,如果还有更好的思路可以一起交流

     

    展开全文
  • 实例280 生成线段(折线) 实例281 生成区域 实例282 生成散列 实例283 生成时序 实例284 生成直方 10.4 绘制基于OHLCDataset数据集的图表 实例285 生成K线 实例286 生成高低(HighLow) 10.5 生成...
  • 实例280 生成线段(折线) 实例281 生成区域 实例282 生成散列 实例283 生成时序 实例284 生成直方 10.4 绘制基于OHLCDataset数据集的图表 实例285 生成K线 实例286 生成高低(HighLow) 10.5 生成...
  • 实例280 生成线段(折线) 实例281 生成区域 实例282 生成散列 实例283 生成时序 实例284 生成直方 10.4 绘制基于OHLCDataset数据集的图表 实例285 生成K线 实例286 生成高低(HighLow) 10.5 生成...
  • Java开发实战1200例.第2卷.part3

    热门讨论 2013-05-08 22:46:34
    实例280 生成线段(折线) 451 实例281 生成区域 453 实例282 生成散列 454 实例283 生成时序 455 实例284 生成直方 457 10.4 绘制基于OHLCDataset数据集的 图表 458 实例285 生成K线 458 实例286 ...
  • Java开发实战1200例.第2卷.part2

    热门讨论 2013-05-08 22:45:35
    实例280 生成线段(折线) 451 实例281 生成区域 453 实例282 生成散列 454 实例283 生成时序 455 实例284 生成直方 457 10.4 绘制基于OHLCDataset数据集的 图表 458 实例285 生成K线 458 实例286 ...
  • Java开发实战1200例.第2卷.part1

    热门讨论 2013-05-08 22:44:13
    实例280 生成线段(折线) 451 实例281 生成区域 453 实例282 生成散列 454 实例283 生成时序 455 实例284 生成直方 457 10.4 绘制基于OHLCDataset数据集的 图表 458 实例285 生成K线 458 实例286 ...
  • 使用 iThoughts 中文版可以把你的点子、创意、会议记录等内容以树状图的形式的显示出来,整体上更加直观,同时还可以导出为 Freemind,Mindmanager,OPML 等程序所兼容的格式,有需要的朋友快快下载吧。当然,博客上...
  • 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变页面中单元格的背景颜色 109 实例076 屏蔽偶数次的数据输出 110 实例...
  • 实例072 图像验证码的生成 106 2.6 跳转语句 107 实例073 控制页面中表情的输出 107 实例074 控制页面中数据的输出数量 108 实例075 动态改变页面中单元格的背景颜色 109 实例076 屏蔽偶数次的数据输出 110 实例...
  • JavaScript网页特效范例宝典源码

    千次下载 热门讨论 2013-09-04 10:40:38
    实例054 树状导航菜单 91 第2章 表单及表单元素 95 2.1 文本框/编辑框/隐藏域组件 96 实例055 获取文本框/编辑框/隐藏域的值 96 实例056 自动计算金额 97 实例057 设置文本框的只读属性 98 实例058 限制多行文本域...
  • 实例293 树状导航菜单 实例294 类似QQ式导航菜单 实例295 将程序图标添加到托盘中 第10章 工具栏与状态栏 10.1 工具栏应用 实例296 利用ToolBar控件创建简单的工具栏 实例297 带图标的工具栏 实例298 IE式...
  • 实例293 树状导航菜单 实例294 类似QQ式导航菜单 实例295 将程序图标添加到托盘中 第10章 工具栏与状态栏 10.1 工具栏应用 实例296 利用ToolBar控件创建简单的工具栏 实例297 带图标的工具栏 实例298 IE式...
  • 子控件包括饼图+圆环+曲线+柱状+柱状分组+横向柱状+横向柱状分组+合格率控件+百分比控件+进度控件+设备状态面板+表格数据+地图控件+视频控件等。 二级界面可以自由拖动悬浮,支持最小化最大化关闭,响应...
  •  (2)增加查找、计算器、文字背景颜色、插入手动分页符、当前**期、当前时间、EXCEL表格、符号、公式等功能,增强了表格编辑功能。  (3)增加了下选菜单功能,如将表格功能的表格的属性、 插入删除行、 插入删除...
  • × 读取文件属性——完成时间,作为月度统计依据,或提供选择,以上传时间为统计口径,生成某个目录下月度成果报表,与上个月对比柱状; × 项目目录编辑完善:ztree目录拖动; × 多关键字检索; × 项目合并和...
  • 44、系统提供与EXCEL的接口,可以将凭证、往来帐、帐薄、报表等内容导出到EXCEL中,您可以对这些导出的数据进行二次加工,生成各种图表格式; 45、各类财务报表、帐簿、凭证支持使用EXCEL格式打印,使打印纸质文件...

空空如也

空空如也

1 2 3
收藏数 60
精华内容 24
关键字:

excel生成树状图