加载中
问题是前期不可能给你那么长时间做高质量的东西. 基本都是用屎山往上堆,根本没时间思考.
项目时间就那么长.
@xplanet
ThoughtWorks 首席科学家 Martin Fowler 指出,软件开发项目中存在一种常见争论,即“花时间...
有必要,jdk8就是joda的阉割版,十分不好用.缺了好多东西.
@路小磊
Hutool是一个 Java 工具包,也只是一个工具包,它帮助我们简化每一行代码,减少每一个方法,让 Java 语...
cn / afterturn / easypoi / cache / manager 中的类都返回null是个不好的处理方式,应该再抛出异常,文件都获得不到了,后继的逻辑怎么处理?
@Anotherjueyue
EasyPoi 快速Office 开发本次更新重点是加入了groupname属性,可以轻松的解决双行表头的数据处理...
1.代码和以前比规范了不少,胡乱起名和各种拼写错误更正了不少,但是还是有, 那个什么 ExcelExportServer 以及以Server结尾的类,本来的目的是一个服务类,而不是服务器类,看里面的注释是要表达这个意思.应该把Server都改Service.
2.捕获异常后不重新抛出具体的异常也不打印日志,胡乱返回null然后这个null会在不知道那个国家爆出空指针异常,让使用者完全不知道错误在哪里. 这个问题也更正了不少.
3.拼写错误基本都更正了.但我还是发现了一个漏网之鱼:
ExcelBatchExportServer batachServer = ExcelBatchExportServer
.getExcelBatchExportServer(entity, pojoClass);
batach应该改为batch
4.Excel模板中的表达式,应该把表达式的解析与其他逻辑分离出来, 这个我也没有想出什么好办法.
5.所有的导入导出,都应该添加一个Callback,用于给用户自己处理当前的数据转换和cell自定义.比如:
Excel模板导出的时候,可以有个Callback,里面有如下方法:
public void execute(Column currentColumn, Row currentRow, Cell currentCell, Object currentRowData,Object currentCellData)
// currentRowData对应的就是currentRow对象,前者是要输入给后者的数据,currentCellData和currentCell亦如是.
// 这里用户就可以任意改当前行列的样式,和任意改当前数据的格式,这个相当于样式自定义和数据转换的结合体
//是不是这种模式可以应用于整个程序中? 原先的那些自定义的表达式都可以使用这个方式改造?
//包括原先的样式处理是否也可以改成这个样?
// 默认添加一些实现,就是原先的逻辑.如果用户想更自由定义样式和数据转换,添加一个这个callback自己进行处理.
//这个callback不是一个而是一个List,可以添加无数个,程序中按顺序进行调用.
//这个类似spring中的那个converter
@Anotherjueyue
EasyPoi 快速Office 开发本次更新重点是加入了groupname属性,可以轻松的解决双行表头的数据处理...
安装个StrokeIt,按住鼠标右键画个C或者添加一个自定义手势下右,在任何地方都能关闭当前窗口.
还可以任意自定义,最小化,等等任何动作.
并且,这个是针对windows所有程序的.
@周其
今天,Canonical公司正式推出了最新版的Ubuntu 17.10,代号为Artful Aardvark(机灵...

你这么也可以,针对IDownloadFileService的实现少的话没问题。一旦多了,处理就麻烦了,你要写多个对应方法来提供不同的实现。  另一种方法是,让前台传递下载服务的类型的参数,根据此参数来获取不同的服务实现,也就是我的那种实现方式。

@RequestMapping(value="/")
public class DowloadController{
    @Autowired
    private ApplicationContext context;

    @RequestMapping(value="download", method=RequestMethod.GET)
    public void download(@RequestParam String type){
        //type值,你可以规定死,必须是你声明的service name,这样,就可以
        IDownloadFileService svc = context.getBean(type, IDownloadFileService.class);
        // 这里getBean方法可能会抛出异常,bean没找到异常,也就是传递type值和你声明的service name不一样,
        // 你可以捕获这个异常直接再抛出为参数错误异常,然后在springboot的统一异常处理中去拦截处理。

        svc.downloadExcelFile();
    }
}

 

@白马秋
案例:一个下载多种文件的功能,我的想法是,(1)一个service接口,声明一个方法(下载文件方法);(2)每种文...
看下面的回答
@白马秋
案例:一个下载多种文件的功能,我的想法是,(1)一个service接口,声明一个方法(下载文件方法);(2)每种文...

逻辑是这样:

1.我这里有很多针对接口IReportService的实现.

2.每个IReportService的实现都有自己自定义的Bean ID. 像下面这样:

@Service(ReportQueryParam.ID_ALERT)  // 里面写的就是自定义Bean ID,不写的话就就是类名称首字母小写
public class ReportServicAlertImpl implements IReportService {...}

3.ReportQueryParam 是针对获得的请求参数的封装, 里面包含一些业务逻辑,
和所有ReprotServiceXxxImpl的Bean ID 常量的定义.

4. 获取服务的地方是这里:

// 这里我使用的是自定义的Service ID,是和业务逻辑相关的ID
String beanName = param.getBeanName()
IReportService reportService = context.getBean(beanName, IReportService.class);

其中,param.getBeanName()做的事情就是 从请求中传递ID,也就是对应的每个ReprotServiceXxxImpl的Bean ID.

接下的代码就是根据这个ID来获取对应的Bean,就是你想要的具体实现了.

@白马秋
案例:一个下载多种文件的功能,我的想法是,(1)一个service接口,声明一个方法(下载文件方法);(2)每种文...
回复 @白马秋 : 看下面的回复.
@白马秋
案例:一个下载多种文件的功能,我的想法是,(1)一个service接口,声明一个方法(下载文件方法);(2)每种文...

你的这个业务逻辑和我的这个几乎一样.建议动态获取相应的Service,否则上面的写法不能动态赋值.

@RestController
@RequestMapping("/json/report")
public class ReportController extends BaseDownloadController {
    @Autowired
    private ApplicationContext context;

    @Autowired
    private ReportTemplateMaker reportTemplateMaker;

    @Autowired
    IFileLoader fileLoader;

    @Value("${app.excel.templatePath}")
    protected String templatePath;

    @PostMapping("/getReportData")
    public Map<String, Object> getReportData(String id, Integer equipmentId, Integer type,
            @RequestParam(required = false) Long startTime,
            @RequestParam(required = false) Long endTime,
            @RequestParam(required = false) Integer time) {

        ReportQueryParam param = ReportQueryParam.newInstance(id, equipmentId, type, startTime,
                endTime, time);
        IReportService reportService = getReportService(param);
        ReportData reportData = reportService.getReportData(param);

        logReportData(param, reportData);

        return reportData;
    }

    @GetMapping("/download")
    public void download(String id, Integer equipmentId, Integer type,
            @RequestParam(required = false) Long startTime,
            @RequestParam(required = false) Long endTime,
            @RequestParam(required = false) Integer time, HttpServletResponse response) {

        ReportQueryParam param = ReportQueryParam.newInstance(id, equipmentId, type, startTime,
                endTime, time);
        IReportService reportService = getReportService(param);
        ReportData reportData = reportService.getReportData(param);

        logReportData(param, reportData);

        boolean hasData = reportService.hasData(param, reportData);

        // 没有数据的情况
        if (!hasData) {
            String fileName = ReportQueryParam.getNullTemplateName();
            InputStream is = reportTemplateMaker.getTemplateInputStream(fileName);
            try {
                Workbook workbook = WorkbookFactory.create(is);
                downloadExcel(fileName, response, workbook,false);
            } catch (EncryptedDocumentException | InvalidFormatException | IOException e) {
                logger.warn("", e);
            }
            return;
        }

        // 导出和下载
        String fileName = ReportQueryParam.getTemplateName(id);
        String newTemplatePath = reportTemplateMaker.makeTemplate(fileName, reportData);

        TemplateExportParams params = new TemplateExportParams(newTemplatePath, true);
        params.setStyle(ExcelStyleType.BORDER.getClazz());
        Workbook workbook = ExcelExportUtil.exportExcel(params, reportData);

        try {
            reportService.mergeCell(param, reportData, workbook);
        } catch (IllegalArgumentException e) {
            /*
             * easypoi版本2.4.0 所引用的 POI版本3.15会出现异常:
             * Merged region A24 must contain 2 or more cells.
             * 但是仍然能合并成功. 这里捕获后忽略这个异常.
             */
        }

        reportService.setColumnsWidth(param, reportData, workbook);
        reportService.setCharts(param, reportData, workbook);

        downloadExcel(fileName, response, workbook);
    }

    public IReportService getReportService(ReportQueryParam param) {
        String beanName = param.getBeanName();
        // 这里我使用的是自定义的Service ID,是和业务逻辑相关的ID,你可以直接使用默认的Service ID
        IReportService reportService = context.getBean(beanName, IReportService.class);

        return reportService;
    }

    private void logReportData(ReportQueryParam param, ReportData reportData) {
        JsonMapper mapper = new JsonMapper();
        String json = mapper.toJson(param);
        logger.info("报表请求参数: {}", json);

        json = mapper.toJson(reportData);
        logger.info("报表数据: {}", json);
    }

 

@白马秋
案例:一个下载多种文件的功能,我的想法是,(1)一个service接口,声明一个方法(下载文件方法);(2)每种文...

@Service("reportServicAlertImpl")  // 里面写的就是默认的ID,不写的话就会使用这个,逻辑就是类名称首字母小写
public class ReportServicAlertImpl implements IReportService {...}

@RestController
@RequestMapping("/json/report")
public class ReportController extends BaseDownloadController {
    @Autowired
    @Qualifier("reportServicAlertImpl") //核心在这里
    private IReportService reportService;
}
 

 

@白马秋
案例:一个下载多种文件的功能,我的想法是,(1)一个service接口,声明一个方法(下载文件方法);(2)每种文...
没写过多少代码的都这么说.
@编辑部的故事
所以,如何写出一手好代码?良好的代码更易于阅读、理解、调试和修改,最重要的是它的缺陷也更少。显然,编写良好的代码需...
属性名首字母大写不能忍
@二十岁以后
1、Spring Boot的属性配置文件 1.1 Spring Boot的属性配置文件的第一种形式 使用prope...
垃圾系统。 各种杂牌子垃圾合约机的老窝。
@局长
6月10日,为期两天的阿里云云栖大会上海峰会正式召开。作为每年云行业都颇为重要的一次会议,各种黑科技和深度合作自然...
mybatis-plus文档真心不敢恭维.
另外,maven换成gradle吧,其他都简化了,为什么不彻底点.
@stylefeng
Guns V2.0新版Guns基于SpringBoot全面升级,完美整合springmvc + shiro + m...
整篇文章描述中提及Java非常少, 但排行表中Java稳稳霸占前3.
@局长
选择正确的编程语言进行学习无疑成为左右个人发展投资成功与否的关键。在今天的编程语言推荐榜中,我们参考了大量可靠且信...
xmlspyspring 2016/12/16 20:42 评论了动弹:
39岁.仍然coding
@贪吃飒
都说程序员是吃青春饭的,像我这种二十多岁码农,据说在IT行业已经是珍稀动物了。我TM就不信,超过20的码农点赞,告诉我你还战斗在第一线!!!!
回复 @沧海_Sea : 是啊, 使用spring boot访问数据库,直接写接口就行,都不用写实现类,json啥的直接使用默认的jackson自动就给解析完了.
@宏哥
一个Json 数据的处理,他们可以搞很多天, 并且弄出很多 设计模式+ 很多面向对象的类一个http请求,再搞一个...
@黄勇 回复@黄勇 : Zeroc ICE的 服务治理 、服务管控等等比较完备。不过文档还是太少了。
@局长
OSCHINA 本期高手问答(10 月 17 日-10 月 23 日) 我们请来了@黄勇 为大家解答关于微服务架构...
@黄勇 :是不是ICE体系能更好的体现微服务?
@局长
OSCHINA 本期高手问答(10 月 17 日-10 月 23 日) 我们请来了@黄勇 为大家解答关于微服务架构...

没有更多内容

加载失败,请刷新页面

返回顶部
顶部