Skip to content

表格打印扩展开发

注意

本示例,使用 KQCO 服务 的地址是:192.168.1.13 端口是:8003 后面会使用此参数

打印模板配置扩展指令

1641456504440

说明

打印模板中表格控件的 打印风格 属性配置为 printOpinionList

新建 springboot 项目

pom.xml 中引入 jar 包: co-service-sdk-api-6.x.x.jar下载

xml
<dependency>
    <groupId>com.kanq.co</groupId>
    <artifactId>co-service-sdk-api</artifactId>
    <version>6.x.x</version>
</dependency>
<dependency>
    <groupId>com.kanq.co</groupId>
    <artifactId>co-service-sdk-api</artifactId>
    <version>6.x.x</version>
</dependency>

启动类SpringBootApplication类配置:

java
//启动类扫描SDK配置项设置--此处必须固定此路径
@ComponentScan({"com.kqgeo.co.ext.*"})
 //忽略数据源配置的话可配置此注解
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class SpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplication.class, args);
    }
}
//启动类扫描SDK配置项设置--此处必须固定此路径
@ComponentScan({"com.kqgeo.co.ext.*"})
 //忽略数据源配置的话可配置此注解
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class SpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringBootApplication.class, args);
    }
}

注意

springboot2.* @ComponentScan({"com.kqgeo.co.ext.*"})
springboot3.* @ComponentScan({"com.kqgeo.co.ext.*","com.kanq.co.core"})

yml 配置(完整配置详见):

yaml
server:
  port: 8888 #端口

coservice: #C++服务相关配置
  '0':
    model: hotStandby
    server:
      - addr: 192.168.1.13 #二开程序的C++配置要与java运行服务使用的C++地址端口保持一致
        port: 8003
cofile:
  affix: C:\\affix\\ #文件存储路径
server:
  port: 8888 #端口

coservice: #C++服务相关配置
  '0':
    model: hotStandby
    server:
      - addr: 192.168.1.13 #二开程序的C++配置要与java运行服务使用的C++地址端口保持一致
        port: 8003
cofile:
  affix: C:\\affix\\ #文件存储路径

coservice

coservice 配置要与平台配置保持一致

扩展接口实现

  • 创建 java 类 com.kqgeo.co.ext.print
  • 增加 public KqcoParm printOpinionList(@RequestBody ObjectNode parameter);方法
  • 增加指令注册注解 @Description(describe = "意见列表打印", instructions = "printOpinionList",requestType = "post", requestUrl = "/co/print/printOpinionList")

注意

  • com.kqgeo.co.ext 包名需要与配置文件中的 packageName 保持一致

  • 注解说明:

    • describe 接口描述
    • requestType 请求方式
    • requestUrl 请求路径,请求路径要求前面 / 不可忽略
    • instructions 指令名称
java
package com.kqgeo.co.ext.print;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.kqgeo.co.ext.config.Description;
import com.kqgeo.co.ext.sdk.KqcoApi;
import com.kqgeo.co.ext.sdk.KqcoParm;
import com.kqgeo.co.ext.sdk.KqcoPrint;
import com.kqgeo.co.ext.sdk.ParmImpl;
import com.kqgeo.co.ext.sdk.print.PrintEntity;
import com.kqgeo.co.ext.sdk.print.PrintGrid;
import com.kqgeo.co.ext.sdk.print.PrintGridColn;
import com.kqgeo.co.ext.sdk.print.PrintGridData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("co/print")
public class PrintDemo {

  //打印表格拓展--嵌套打印
  @RequestMapping(value = "/printOpinionList", method = RequestMethod.POST)
  @Description(describe = "意见列表打印", instructions = "printOpinionList",requestType = "post", requestUrl = "/co/print/printOpinionList")
  public KqcoParm printOpinionList(@RequestBody ObjectNode parameter) {
    String m_sTicket ="tiket-5c396f8c702840fd9ae6523f9a70dac4";
    KqcoApi kqcoApi = KqcoApiUtils.getKocoApi(m_sTicket);
    kqcoApi.m_sAddr="trace-eb3eb80039444d9c9e2f6cf60a5a90dd";
    // 参数检查
    if (kqcoParm.setRequest(parameter) != 0) {
      return kqcoParm;
    }
    //从参数中取出控件名称
    ObjectNode parmJson = kqcoParm.getRequest();
    JsonNode argsJson = parmJson.get("args");
    //获取xml
    String xml = argsJson.get(0).asText();
    //获取处理打印拓展对象
    KqcoPrint kqcoPrint = kqcoApi.getKqcoPrint();
    //初始化打印实体对象
    PrintEntity printEntity = kqcoPrint.getPrintEntity(xml);
    //从xml中取出表格对象与表格头对象
    String sHead = printEntity.getDataByKey("head");
    String sData = printEntity.getDataByKey("data");
    //从xml中取出表格对象与表格头对象
    PrintGrid grid = kqcoPrint.getPrintGrid(sHead, sData, xml);
    PrintEntity gridRowEntity = null;
    //以列表行数为循环次数处理---此为行列嵌套打印
    for (int i = 0; i < grid.getRowCount(); i++) {
      if (i == 0) {
        // 列表的第一行默认为添加子级
        gridRowEntity = printEntity.addEntityToInner();
      } else {
        // 列表的剩余行添加为子级的同级(向右或向下添加)
        gridRowEntity = gridRowEntity.addEntityToBottom();
        //gridRowEntity = gridRowEntity.addEntityToRight();
      }
      //设置当前高度
      gridRowEntity.setHeigth(80);
      PrintEntity colnEntity = null;
      //获取表格行的处理对象
      PrintGridData gridData = grid.getRow(i);
      //以表格列数为循环次数处理
      for (int j = 0; j < grid.getColnCount(); j++) {
        if (j == 0) {
          // 第一列默认为添加子级,传参i标识列表行位置
          colnEntity = gridRowEntity.addEntityToInner();
        } else {
          // 剩余列添加为子级的同级(向右或向下添加)
          //colnEntity = colnEntity.addEntityToRight();//在一行的后面增加
          colnEntity = colnEntity.addEntityToBottom();//在一行的下面增加
        }

        //获取表格头操作对象
        PrintGridColn gridColn = grid.getColn(j);
        //保存当前打印文本内容
        colnEntity.setText(gridData.getData(i, j));
        //设置打印水平位置
        colnEntity.setAlignY(gridColn.getAlginY());
        //设置宽为当前列表头的宽度
        colnEntity.setWidth(gridColn.getWidth(j));// 如果要取列的宽度
        //自定义设置列的高
        colnEntity.setHeigth(30);
        //自定义设置列的宽
        colnEntity.setWidth(100);
        //自定义设置x轴偏移量
        colnEntity.setOffsetX(20);
        //设置是否显示边框
        colnEntity.setBorder(0);
      }
    }
    kqcoParm.setParameter(printEntity.toXml());
    return kqcoParm;
  }

  //打印表格拓展--并列打印
  @RequestMapping(value = "/printOpinionList", method = RequestMethod.POST)
  @Description(describe = "意见列表打印", instructions = "printOpinionList",requestType = "post", requestUrl = "/co/print/printOpinionList")
  public KqcoParm printOpinionList(@RequestBody ObjectNode parameter) {
    String m_sTicket ="tiket-5c396f8c702840fd9ae6523f9a70dac4";
    KqcoApi kqcoApi = KqcoApiUtils.getKocoApi(m_sTicket);
    kqcoApi.m_sAddr="trace-eb3eb80039444d9c9e2f6cf60a5a90dd";
    // 参数检查
    if (kqcoParm.setRequest(parameter) != 0) {
      return kqcoParm;
    }
    //从参数中取出控件名称
    ObjectNode parmJson = kqcoParm.getRequest();
    JsonNode argsJson = parmJson.get("args");
    //获取xml
    String xml = argsJson.get(0).asText();
    //获取处理打印拓展对象
    KqcoPrint kqcoPrint = kqcoApi.getKqcoPrint();
    //初始化打印实体对象
    PrintEntity printEntity = kqcoPrint.getPrintEntity(xml);
    //从xml中取出表格对象与表格头对象
    String sHead = printEntity.getDataByKey("head");
    String sData = printEntity.getDataByKey("data");
    //从xml中取出表格对象与表格头对象
    PrintGrid grid = kqcoPrint.getPrintGrid(sHead, sData, xml);
    PrintEntity gridRowEntity = null;
    //以列表行数为循环次数处理---此为行列同级平行打印
    for (int i = 0; i < grid.getRowCount(); i++) {
      // 每行的第一个
      if (i == 0) {
        // 列表的第一行默认为添加子级
        gridRowEntity = printEntity.addEntityToInner();
      } else {
        // 列表的剩余行添加为子级的同级(向右或向下添加)
        gridRowEntity = gridRowEntity.addEntityToBottom();
        //gridRowEntity = gridRowEntity.addEntityToRight();
        //自定义设置x轴偏移量
        gridRowEntity.setOffsetX(-20);
        //自定义设置Y轴偏移量
        gridRowEntity.setOffsetY(20);
      }
      //设置行属性与列属性相同
      PrintEntity colnEntity = gridRowEntity;
      //获取打印行属性操作对象
      PrintGridData gridData = grid.getRow(i);
      //以表格列数为循环次数处理
      for (int j = 0; j < grid.getColnCount(); j++) {
        // 第一个已经增加
        if (j > 0) {
          colnEntity = colnEntity.addEntityToRight();//在一行的后面增加
        }
        //获取表格头操作对象
        PrintGridColn gridColn = grid.getColn(j);
        //保存当前打印文本内容
        colnEntity.setText(gridData.getData(i, j));
        //设置打印水平位置
        colnEntity.setAlignY(gridColn.getAlginY());
        //设置宽为当前列表头的宽度
        colnEntity.setWidth(gridColn.getWidth(j));// 如果要取列的宽度
        //自定义设置列的高
        colnEntity.setHeigth(30);
        //自定义设置列的宽
        colnEntity.setWidth(100);
        //自定义设置x轴偏移量
        colnEntity.setOffsetX(20);
        //设置是否显示边框
        colnEntity.setBorder(0);
      }
    }
    kqcoParm.setParameter(printEntity.toXml());
    return kqcoParm;
  }
}


package com.kqgeo.co.ext.print;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.kqgeo.co.ext.config.Description;
import com.kqgeo.co.ext.sdk.KqcoApi;
import com.kqgeo.co.ext.sdk.KqcoParm;
import com.kqgeo.co.ext.sdk.KqcoPrint;
import com.kqgeo.co.ext.sdk.ParmImpl;
import com.kqgeo.co.ext.sdk.print.PrintEntity;
import com.kqgeo.co.ext.sdk.print.PrintGrid;
import com.kqgeo.co.ext.sdk.print.PrintGridColn;
import com.kqgeo.co.ext.sdk.print.PrintGridData;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("co/print")
public class PrintDemo {

  //打印表格拓展--嵌套打印
  @RequestMapping(value = "/printOpinionList", method = RequestMethod.POST)
  @Description(describe = "意见列表打印", instructions = "printOpinionList",requestType = "post", requestUrl = "/co/print/printOpinionList")
  public KqcoParm printOpinionList(@RequestBody ObjectNode parameter) {
    String m_sTicket ="tiket-5c396f8c702840fd9ae6523f9a70dac4";
    KqcoApi kqcoApi = KqcoApiUtils.getKocoApi(m_sTicket);
    kqcoApi.m_sAddr="trace-eb3eb80039444d9c9e2f6cf60a5a90dd";
    // 参数检查
    if (kqcoParm.setRequest(parameter) != 0) {
      return kqcoParm;
    }
    //从参数中取出控件名称
    ObjectNode parmJson = kqcoParm.getRequest();
    JsonNode argsJson = parmJson.get("args");
    //获取xml
    String xml = argsJson.get(0).asText();
    //获取处理打印拓展对象
    KqcoPrint kqcoPrint = kqcoApi.getKqcoPrint();
    //初始化打印实体对象
    PrintEntity printEntity = kqcoPrint.getPrintEntity(xml);
    //从xml中取出表格对象与表格头对象
    String sHead = printEntity.getDataByKey("head");
    String sData = printEntity.getDataByKey("data");
    //从xml中取出表格对象与表格头对象
    PrintGrid grid = kqcoPrint.getPrintGrid(sHead, sData, xml);
    PrintEntity gridRowEntity = null;
    //以列表行数为循环次数处理---此为行列嵌套打印
    for (int i = 0; i < grid.getRowCount(); i++) {
      if (i == 0) {
        // 列表的第一行默认为添加子级
        gridRowEntity = printEntity.addEntityToInner();
      } else {
        // 列表的剩余行添加为子级的同级(向右或向下添加)
        gridRowEntity = gridRowEntity.addEntityToBottom();
        //gridRowEntity = gridRowEntity.addEntityToRight();
      }
      //设置当前高度
      gridRowEntity.setHeigth(80);
      PrintEntity colnEntity = null;
      //获取表格行的处理对象
      PrintGridData gridData = grid.getRow(i);
      //以表格列数为循环次数处理
      for (int j = 0; j < grid.getColnCount(); j++) {
        if (j == 0) {
          // 第一列默认为添加子级,传参i标识列表行位置
          colnEntity = gridRowEntity.addEntityToInner();
        } else {
          // 剩余列添加为子级的同级(向右或向下添加)
          //colnEntity = colnEntity.addEntityToRight();//在一行的后面增加
          colnEntity = colnEntity.addEntityToBottom();//在一行的下面增加
        }

        //获取表格头操作对象
        PrintGridColn gridColn = grid.getColn(j);
        //保存当前打印文本内容
        colnEntity.setText(gridData.getData(i, j));
        //设置打印水平位置
        colnEntity.setAlignY(gridColn.getAlginY());
        //设置宽为当前列表头的宽度
        colnEntity.setWidth(gridColn.getWidth(j));// 如果要取列的宽度
        //自定义设置列的高
        colnEntity.setHeigth(30);
        //自定义设置列的宽
        colnEntity.setWidth(100);
        //自定义设置x轴偏移量
        colnEntity.setOffsetX(20);
        //设置是否显示边框
        colnEntity.setBorder(0);
      }
    }
    kqcoParm.setParameter(printEntity.toXml());
    return kqcoParm;
  }

  //打印表格拓展--并列打印
  @RequestMapping(value = "/printOpinionList", method = RequestMethod.POST)
  @Description(describe = "意见列表打印", instructions = "printOpinionList",requestType = "post", requestUrl = "/co/print/printOpinionList")
  public KqcoParm printOpinionList(@RequestBody ObjectNode parameter) {
    String m_sTicket ="tiket-5c396f8c702840fd9ae6523f9a70dac4";
    KqcoApi kqcoApi = KqcoApiUtils.getKocoApi(m_sTicket);
    kqcoApi.m_sAddr="trace-eb3eb80039444d9c9e2f6cf60a5a90dd";
    // 参数检查
    if (kqcoParm.setRequest(parameter) != 0) {
      return kqcoParm;
    }
    //从参数中取出控件名称
    ObjectNode parmJson = kqcoParm.getRequest();
    JsonNode argsJson = parmJson.get("args");
    //获取xml
    String xml = argsJson.get(0).asText();
    //获取处理打印拓展对象
    KqcoPrint kqcoPrint = kqcoApi.getKqcoPrint();
    //初始化打印实体对象
    PrintEntity printEntity = kqcoPrint.getPrintEntity(xml);
    //从xml中取出表格对象与表格头对象
    String sHead = printEntity.getDataByKey("head");
    String sData = printEntity.getDataByKey("data");
    //从xml中取出表格对象与表格头对象
    PrintGrid grid = kqcoPrint.getPrintGrid(sHead, sData, xml);
    PrintEntity gridRowEntity = null;
    //以列表行数为循环次数处理---此为行列同级平行打印
    for (int i = 0; i < grid.getRowCount(); i++) {
      // 每行的第一个
      if (i == 0) {
        // 列表的第一行默认为添加子级
        gridRowEntity = printEntity.addEntityToInner();
      } else {
        // 列表的剩余行添加为子级的同级(向右或向下添加)
        gridRowEntity = gridRowEntity.addEntityToBottom();
        //gridRowEntity = gridRowEntity.addEntityToRight();
        //自定义设置x轴偏移量
        gridRowEntity.setOffsetX(-20);
        //自定义设置Y轴偏移量
        gridRowEntity.setOffsetY(20);
      }
      //设置行属性与列属性相同
      PrintEntity colnEntity = gridRowEntity;
      //获取打印行属性操作对象
      PrintGridData gridData = grid.getRow(i);
      //以表格列数为循环次数处理
      for (int j = 0; j < grid.getColnCount(); j++) {
        // 第一个已经增加
        if (j > 0) {
          colnEntity = colnEntity.addEntityToRight();//在一行的后面增加
        }
        //获取表格头操作对象
        PrintGridColn gridColn = grid.getColn(j);
        //保存当前打印文本内容
        colnEntity.setText(gridData.getData(i, j));
        //设置打印水平位置
        colnEntity.setAlignY(gridColn.getAlginY());
        //设置宽为当前列表头的宽度
        colnEntity.setWidth(gridColn.getWidth(j));// 如果要取列的宽度
        //自定义设置列的高
        colnEntity.setHeigth(30);
        //自定义设置列的宽
        colnEntity.setWidth(100);
        //自定义设置x轴偏移量
        colnEntity.setOffsetX(20);
        //设置是否显示边框
        colnEntity.setBorder(0);
      }
    }
    kqcoParm.setParameter(printEntity.toXml());
    return kqcoParm;
  }
}


启动服务

扩展开发注册成功如下:

1641458885925

  • 测试打印

点击打印:1641459216769

配置二开之前的打印效果:

1641462188388

配置二开之后打印效果:

1641462188387

DEMO 代码下载

本示例代码在 com.kqgeo.co.ext.PrintDemo 类中的 printOpinionList 方法

Powerd by Vitepress.