当前位置:   article > 正文

若依单体版导出Excel动态选择导出特定的列_若依导出指定列到excel

若依导出指定列到excel

一、可以采用两种方式去实现导出特定的列

1.第一种就是直接获取列表右侧中的列选择中,所勾选的列

a.将得到的selectedColumns ,传到后端,可以增加一个

  1. var selectedColumns = [];
  2. // 初始化输出已选中的列
  3. function outputSelectedColumns() {
  4. $('.dropdown-menu input[type="checkbox"]:checked').each(function() {
  5. var field = $(this).data('field');
  6. selectedColumns.push(field);
  7. });
  8. }
  9. // 在页面加载时调用一次
  10. outputSelectedColumns();
  11. // 在这里添加代码以处理勾选了显示的列
  12. $('.dropdown-menu input[type="checkbox"]').on('change', function() {
  13. outputSelectedColumns();
  14. });

b.增加传参exportUrl: prefix + "/export/{selectedColumns}", 

  1. $(function() {
  2. var options = {
  3. url: prefix + "/list",
  4. createUrl: prefix + "/add",
  5. updateUrl: prefix + "/edit/{id}",
  6. recoveryUrl: prefix1 + "/add/{id}",
  7. removeUrl: prefix + "/remove",
  8. exportUrl: prefix + "/export/{selectedColumns}",

 c.自己新增一个导出事件,用于选择列导出,处理选择列的参数传递

  1. // 导出数据
  2. exportExcel1: function(formId,selectedColumns) {
  3. table.set();
  4. $.modal.confirm("确定导出所有" + table.options.modalName + "吗?", function() {
  5. var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
  6. var params = $("#" + table.options.id).bootstrapTable('getOptions');
  7. var dataParam = $("#" + currentId).serializeArray();
  8. dataParam.push({ "name": "orderByColumn", "value": params.sortName });
  9. dataParam.push({ "name": "isAsc", "value": params.sortOrder });
  10. $.modal.loading("正在导出数据,请稍候...");
  11. var url = table.options.exportUrl.replace("{selectedColumns}", selectedColumns);
  12. $.post(url, dataParam, function(result) {
  13. if (result.code == web_status.SUCCESS) {
  14. window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true;
  15. } else if (result.code == web_status.WARNING) {
  16. $.modal.alertWarning(result.msg)
  17. } else {
  18. $.modal.alertError(result.msg);
  19. }
  20. $.modal.closeLoading();
  21. });
  22. });
  23. },

d.后端导出接口 ,对传递来的选择列进行处理,主要是调用util.hideColumn方法,这个是若依自带的一个隐藏列属性方法,

  1. /**
  2. * 隐藏Excel中列属性
  3. *
  4. * @param fields 列属性名 示例[单个"name"/多个"id","name"]
  5. * @throws Exception
  6. */
  7. public void hideColumn(String... fields)
  8. {
  9. this.excludeFields = fields;
  10. }


获取到导出类的所有属性名,再根据勾选的列,去排除已经勾选的项,将未勾选的项过滤出来,再使用hideColumn方法去隐藏,即可导出想要的数据

  1. // 获取指定类的所有属性名
  2. private String[] getAllColumns(Class<?> clazz) {
  3. List<String> columns = new ArrayList<>();
  4. Field[] fields = clazz.getDeclaredFields();
  5. for (Field field : fields) {
  6. columns.add(field.getName());
  7. }
  8. return columns.toArray(new String[0]);
  9. }
  1. public AjaxResult export(@PathVariable("selectedColumns") String[] selectedColumns,StockBaseInfo stockBaseInfo) {
  2. Map<String, String[]> map = new HashMap<>();
  3. String[] allColumns = getAllColumns(StockBaseInfo.class);
  4. // 将 selectedColumns 转换为 Set,以便更快地检查是否包含某个属性
  5. Set<String> selectedSet = new HashSet<>(Arrays.asList(selectedColumns));
  6. // 使用列表来存储未选择的列
  7. List<String> remainingColumns = new ArrayList<>();
  8. // 遍历所有列,并将未选择的列添加到 remainingColumns 列表中
  9. for (String column : allColumns) {
  10. if (!selectedSet.contains(column)) {
  11. remainingColumns.add(column);
  12. }
  13. }
  14. // 将 remainingColumns 转换回数组
  15. String[] finalColumns = remainingColumns.toArray(new String[0]);
  16. ExcelUtil<StockBaseInfo> util = new ExcelUtil<StockBaseInfo>(StockBaseInfo.class);
  17. util.setExtendCombos(map);
  18. util.hideColumn(finalColumns);
  19. return util.exportExcel(list, "信息数据");

2.第二种就是在导出按钮中增加一个处理页面,可以使用字典(字典键值使用属性名,当然为了安全考虑,可以自己加解密),使用复选框,这里勾选要导出列

a.导出按钮触发方法,弹出选择页面

  1. function exportExcel(){
  2. var title = "导出操作";
  3. var url = prefix + "/exportSelect";
  4. layer.open({
  5. type: 2,
  6. area: [ '800px', '550px'],//
  7. fix: false,
  8. //不固定
  9. maxmin: true,
  10. shade: 0.3,
  11. title: title,
  12. content: url,
  13. btn: ['确定', '关闭'],
  14. // 弹层外区域关闭
  15. shadeClose: true,
  16. yes: function (index, layero) {
  17. var iframeWin = layero.find('iframe')[0];
  18. var exportFields = [];
  19. var checkboxes = iframeWin.contentWindow.document.querySelectorAll('input[name="exportFields"]:checked');
  20. checkboxes.forEach(function(checkbox) {
  21. exportFields.push(checkbox.value);
  22. });
  23. if(exportFields==null || exportFields==''){
  24. $.modal.alert('请选择要导出的字段', modal_status.WARNING);
  25. }else{
  26. $.table.exportExcel1("formId",exportFields);
  27. layer.close(index);
  28. }
  29. },
  30. cancel: function (index) {
  31. return true;
  32. }
  33. });
  34. }

 b.弹出选择页面

  1. /**
  2. * 跳转到导出选择页面
  3. *
  4. * @param mmap
  5. * @return
  6. */
  7. @RequiresPermissions("stock:baseinfo:export")
  8. @GetMapping("/exportSelect")
  9. public String exportSelect(ModelMap mmap) {
  10. return prefix + "/exportSelect";
  11. }

c.选择页面代码,字段少也可以不使用字典

  1. <!DOCTYPE html>
  2. <html lang="zh" xmlns:th="http://www.thymeleaf.org" >
  3. <head>
  4. <th:block th:include="include :: header('导出')" />
  5. </head>
  6. <body class="white-bg">
  7. <div class="wrapper wrapper-content animated fadeInRight ibox-content">
  8. <form class="form-horizontal m" id="formId" >
  9. <div class="form-group">
  10. <label class="col-sm-3 control-label">导出字段:</label>
  11. <div class="col-sm-8" th:with="type=${@dict.getType('stock_export_fields')}">
  12. <label th:each="dict : ${type}" class="check-box">
  13. <input name="exportFields" type="checkbox" th:value="${dict.dictValue}" th:text="${dict.dictLabel}">
  14. </label>
  15. </div>
  16. </div>
  17. <div class="form-group">
  18. <label class="col-sm-3 control-label"></label>
  19. <div class="col-sm-8">
  20. <a class="btn btn-primary btn-rounded btn-sm" onclick="allSelect(true)"><i class="fa fa-check"></i>&nbsp;全选</a>
  21. <a class="btn btn-warning btn-rounded btn-sm" onclick="allSelect(false)"><i class="fa fa-refresh"></i>&nbsp;重置</a>
  22. </div>
  23. </div>
  24. </form>
  25. </div>
  26. <th:block th:include="include :: footer" />
  27. <script th:inline="javascript">
  28. var prefix = ctx + "stock/baseinfo";
  29. $(function() {
  30. });
  31. function allSelect(s) {
  32. var checkboxes = document.querySelectorAll('input[name="exportFields"]');
  33. checkboxes.forEach(function(checkbox) {
  34. checkbox.checked = s;
  35. if (s) {
  36. checkbox.closest('.icheckbox-blue').classList.add('checked');
  37. } else {
  38. checkbox.closest('.icheckbox-blue').classList.remove('checked');
  39. }
  40. });
  41. }
  42. </script>
  43. </body>
  44. </html>

d.选择后一样触发exportExcel1

  1. // 导出数据
  2. exportExcel1: function(formId,selectedColumns) {
  3. table.set();
  4. $.modal.confirm("确定导出所有" + table.options.modalName + "吗?", function() {
  5. var currentId = $.common.isEmpty(formId) ? $('form').attr('id') : formId;
  6. var params = $("#" + table.options.id).bootstrapTable('getOptions');
  7. var dataParam = $("#" + currentId).serializeArray();
  8. dataParam.push({ "name": "orderByColumn", "value": params.sortName });
  9. dataParam.push({ "name": "isAsc", "value": params.sortOrder });
  10. $.modal.loading("正在导出数据,请稍候...");
  11. var url = table.options.exportUrl.replace("{selectedColumns}", selectedColumns);
  12. $.post(url, dataParam, function(result) {
  13. if (result.code == web_status.SUCCESS) {
  14. window.location.href = ctx + "common/download?fileName=" + encodeURI(result.msg) + "&delete=" + true;
  15. } else if (result.code == web_status.WARNING) {
  16. $.modal.alertWarning(result.msg)
  17. } else {
  18. $.modal.alertError(result.msg);
  19. }
  20. $.modal.closeLoading();
  21. });
  22. });
  23. },

e.后端也是采用同一个处理方法,也可以参考第一种方法的后端处理
 

如果文章对你有帮助,请给我一个小小的赞,谢谢~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/595024
推荐阅读
相关标签
  

闽ICP备14008679号