单据设计导出excel(字段,标识,类型)原创
金蝶云社区-技术支持与赋能部_ZH
技术支持与赋能部_ZH
6人赞赏了该文章 1141次浏览 未经作者许可,禁止转载编辑于2022年07月05日 19:17:12

项目中有时候需要导出单据的字段设计给到没有办法进入开发环境的其他开发人员。这时候需要我们开发一个导出功能,把字段,和字段标识,字段类型导出来。废话不多说直接上代码

public class Alltypes extends AbstractFormPlugin{

	@Override
	public void registerListener(EventObject e) {
		// TODO Auto-generated method stub
		super.registerListener(e);
		this.addItemClickListeners("tbmain");
	}
	
	@Override
	public void beforeItemClick(BeforeItemClickEvent evt) {
		// TODO Auto-generated method stub
		super.beforeItemClick(evt);
		if (evt.getItemKey().equals("exportapi")) {
			
			getPageAllData("exportdemo");
			
		}
	}
		public Map getPageAllData(String formId){
		
		List list=new ArrayList();
		List listcaption=new ArrayList();
		listcaption.add("字段名");
		listcaption.add("标识");
		listcaption.add("字段类型");
		list.add(listcaption);
			
		HashMap<String, Object> map = new HashMap<>();
		MainEntityType entityType=EntityMetadataCache.getDataEntityType(formId);
		FormMetadata taskMeta=(FormMetadata)MetadataDao.readRuntimeMeta(MetadataDao.getIdByNumber(entityType.getName(),MetaCategory.Form),MetaCategory.Form);
		List<ControlAp<?>>items=taskMeta.getItems();
		for(ControlAp<?> item :items) {
			if(item instanceof FieldAp) {
				
				String key=item.getKey();
				String name = item.getName().getLocaleValue();
				Control control = this.getView().getControl(key);
				if(control!=null) {
					List listvalue=new ArrayList();
					String type = control.getClass().getSimpleName();
					listvalue.add(name);
					listvalue.add(key);
					listvalue.add(type);
					System.out.println(name+"------"+key+"----------"+type);
					list.add(listvalue);
				}
			}
		}
		
	// 创建excel
        XSSFWorkbook workbook = excel(list, "单据设计");
        // 上传
        String path = upload("exportdemo", workbook);
        
      //下载
        getView().openUrl(RequestContext.get().getClientFullContextPath() + "/attachment/download.do?path=" + path);
		return map;
	}
	/**
     * excel生成
     * @param excel 数据源,List<List<String>>,外层的list是行,里面的List<String>是列,存储value
     *              excel.size()是行数,excel.get(n).size()是列数
     * @return
     */
    private XSSFWorkbook excel(List<List<String>> excel, String title) {
        //创建excel工作簿
        XSSFWorkbook workbook = new XSSFWorkbook();
        //创建工作表sheet
        XSSFSheet sheet = workbook.createSheet();
        //设置默认列宽
        sheet.setDefaultColumnWidth(20);

        // 创建标题
        XSSFRow headRow = sheet.createRow(0);
        XSSFCell headCell = headRow.createCell(0);
        headCell.setCellValue(title);

        // 设置首行标题的一些风格样式
        XSSFCellStyle titleStyle = workbook.createCellStyle();
        // 设置背景色
        //设置填充方案
        titleStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
        // 正红色
        //setBorder.setFillForegroundColor(new XSSFColor(Color.RED));
        // 设置自定义填充颜色,天蓝色
        titleStyle.setFillForegroundColor(new XSSFColor(new Color(255,255,255)));
        // 设置水平居中
        titleStyle.setAlignment(HorizontalAlignment.CENTER);
        // 设置垂直居中
        titleStyle.setVerticalAlignment(VerticalAlignment.CENTER);
        // 设置字
        XSSFFont font = workbook.createFont();
        // 字体颜色橘红色
        font.setColor(new XSSFColor(new Color(0 ,0,0)));
        // 设置字号
        font.setFontHeight(15);
        // 设置字体
        font.setFontName("微软雅黑");
        titleStyle.setFont(font);

        headCell.setCellStyle(titleStyle);

        // 合并第1行的前几列,合并列数 = excel的列数
        CellRangeAddress titleCellAddresses = new CellRangeAddress(0, 0, 0, excel.get(0).size()-1);
        sheet.addMergedRegion(titleCellAddresses);

        // 单据列表数据风格样式,设置字体为黑体,字号15
        XSSFCellStyle billStyle = workbook.createCellStyle();
        XSSFFont billFont = workbook.createFont();
        billFont.setFontName("黑体");
        billFont.setFontHeight(15);
        billStyle.setFont(billFont);
        //写入单据列表数据
        for (int i = 0; i < excel.size(); i++) {
            // i+1是因为前面第1行加了一个标题,单据列表数据是从Excel的第2行开始的,所以要+1
            XSSFRow nrow = sheet.createRow(i+1);
            for (int u=0;u<excel.get(i).size();u++){
                XSSFCell ncell = nrow.createCell(u);
                ncell.setCellStyle(billStyle);
                ncell.setCellValue(excel.get(i).get(u));
            }
        }
        return workbook;
    }
    /**
    *
    * @param entityName
    * @param workbook
    * @return path 路径
    */
   private String upload (String entityName, XSSFWorkbook workbook) {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd_HH_mm_ss");
       String fileName = entityName + sdf.format(new Date()) + ".xlsx";
       String pathName = "/offices/" + fileName;
       try {
           OutputStream outputStream = new ByteArrayOutputStream();
           workbook.write(outputStream);
           InputStream inputStream = parse(outputStream);

           FileService fs = FileServiceFactory.getAttachmentFileService();
           String path = fs.upload(new FileItem(fileName, pathName, inputStream));

           return path;
       } catch (Exception e) {
           System.out.println(e.getMessage());
       }
       return "";
   }
    
   /**
    * outputStream转inputStream
    * @param out outputStream
    * @return inputStream
    * @throws Exception
    */
   public ByteArrayInputStream parse(final OutputStream out) throws Exception {
       ByteArrayOutputStream baos = (ByteArrayOutputStream) out;
       final ByteArrayInputStream swapStream = new ByteArrayInputStream(baos.toByteArray());
       return swapStream;
   }
    
	

效果预览

20220704213021911.png

导出后的excel

20220704213148673.png


赞 6