# 如何二开列表插件干预引出数据

## 插件如何工作

用户通过列表触发引出操作，准备列表相关参数后，弹出引出进度界面后，启动引出线程开始根据参数生成引出日志，准备并格式化引出数据，生成临时文件，上传附件服务器，发送消息通知。

整个引出过程中，引出线程会不停更新列表页面缓存的进度相关数据，进度界面不停轮询列表的页面缓存，并根据进度数据更新界面。引出完成后会自动下载，并关闭精度界面。

```java
// 列表插件基类AbstractListPlugin会提供如下方法：
/**
 * 查询引出数据前事件
 * @param e
 */
default void beforeQueryOfExport(BeforeQueryOfExportEvent e)
 
/**
 * 查询引出数据后事件
 * @param e
 */
default void afterQueryOfExport(AfterQueryOfExportEvent e)
 
// 按模板引出前查询事件提供方法如下：
public class BeforeQueryOfExportEvent extends EventObject {
    /**
     * 获取查询字段
     */
    public String getSelectFields()
    /**
     * 设置查询字段
     */
    public void setSelectFields(String selectFields)
    /**
     * 获取排序字段
     */
    public String getOrderBys()
    /**
     * 设置排序字段
     */
    public void setOrderBys(String orderBys)
    /**
     * 获取过滤条件
     */
    public QFilter[] getFilters()
    /**
     * 设置过滤条件
     */
    public void setFilters(QFilter[] filters)
}
 
// 按模板引出查询数据后事件
public class AfterQueryOfExportEvent extends EventObject {
    /**
     * 获取查询数据
     */
    public DynamicObject[] getQueryValues() 
    /**
     * 返回查询数据
     */
    public void setQueryValues(DynamicObject[] queryValues)
}

 
```

## 引入插件开发步骤

首先，创建一个插件类，继承列表插件基类AbstractListPlugin；然后根据需要重写上面提到的方法（具体详情参看插件类的方法注释）；最后将列表插件挂载到列表插件里面。

![](images\clip_image002.jpg)

## 其他问题

1. 引出插件中如何修改引出文件的内容或者格式？

    ```
    @Override
    public void afterExportFile(AfterExportFileEvent e) {
        File file = e.getFile();
        if (file != null) {
            try (FileInputStream fis = new FileInputStream(file);) {
                Workbook wb = new XSSFWorkbook(fis);
                Sheet sheet = wb.getSheetAt(0);
                // 修改背景颜色（示例写死，自行修改）
                for (int i = 3; i < 5; i++) {
                    CellStyle cs = wb.createCellStyle();
                    cs.setFillForegroundColor(IndexedColors.RED.getIndex());
                    cs.setFillPattern(FillPatternType.SOLID_FOREGROUND);
                    sheet.getRow(i).getCell(1).setCellStyle(cs);
                }
                // 保存
                FileOutputStream out = new FileOutputStream(file);
                wb.write(out);
                wb.close();
                out.close();
            } catch (Throwable ex) {
                ex.printStackTrace();
            }
        }
    }
    ```