精华内容
下载资源
问答
  • 操作 element-ui 的 el-table 时,想要快速tab切换光标到指定的列的输入框中,而不是把一行有聚焦的都tab切换选中一遍(如有el-button时,按tab切换也会切换到它上面去)。并且鼠标单击输入框时,自动全选内容

    简介

    操作 element-uiel-table 时,想要快速tab切换光标到指定的列的输入框中,而不是把一行有聚焦的都tab切换选中一遍(如有el-button时,按tab切换也会切换到它上面去)。
    并且鼠标单击输入框时,自动全选内容。

    要用到的功能点:

    1.自定义单元列的内容:

    由于本功能需要行的索引,所以使用了slot-scope="scope"
    
    // 1. slot-scope="scope"  (此处scope是表格的行属性)
    <template slot-scope="scope"></template>
    
    // 2.  #default="{row}"  (此处row类似scope.row)
    <template #default="{row}"></template>
    

    2.获取行的数据:scope.row.属性

    <template slot-scope="scope">{{scope.row.id}}</template>
    

    3.获取单元行的索引:scope.$index

    <template slot-scope="scope">{{scope.$index}}</template>
    

    具体实现

    <template>
      <div class="object-type-data-list-box">
        <div class="object-type-data-list-table">
          <el-table :data="tableData" height="100%" border stripe>
            <el-table-column prop="url" label="缩略图" width="125">
              <template slot-scope="scope">
                <el-image class="table-row-image" :lazy="true" :src="scope.row.url" fit="contain"></el-image>
              </template>
            </el-table-column>
            <el-table-column prop="code" label="code" width="100"> </el-table-column>
            <el-table-column prop="title0" label="中文">
              <template slot-scope="scope">
                <input
                  :ref="'table' + scope.$index + 'title0'"
                  v-model="scope.row.title0"
                  type="text"
                  maxlength="300"
                  @keydown="tableRowInputKeyup($event, scope.$index, 'title0')"
                  @focus="selectTableRowInputFun('table' + scope.$index + 'title0')"
                />
              </template>
            </el-table-column>
            <el-table-column prop="title1" label="繁体">
              <template slot-scope="scope">
                <input
                  :ref="'table' + scope.$index + 'title1'"
                  v-model="scope.row.title1"
                  type="text"
                  maxlength="300"
                  @keydown="tableRowInputKeyup($event, scope.$index, 'title1')"
                  @focus="selectTableRowInputFun('table' + scope.$index + 'title1')"
                />
              </template>
            </el-table-column>
            <el-table-column prop="title2" label="英文">
              <template slot-scope="scope">
                <input
                  :ref="'table' + scope.$index + 'title2'"
                  v-model="scope.row.title2"
                  type="text"
                  maxlength="300"
                  @keydown="tableRowInputKeyup($event, scope.$index, 'title2')"
                  @focus="selectTableRowInputFun('table' + scope.$index + 'title2')"
                />
              </template>
              ></el-table-column
            >
            <el-table-column label="操作" width="80">
              <template #default="{row}">
                <el-button type="primary" size="mini" @click="toObjectItemDetail(row)">详情</el-button>
              </template>
            </el-table-column>
          </el-table>
        </div>
      </div>
    </template>
    
    <script>
    export default {
      data() {
        return {
          defaultImg: require('@/core/components/image/common/failToLoadTwo.png'), // 默认图片
          thumbnail: {
            title0: '缩略图',
            title1: '缩略图',
            title2: 'Thumbnail'
          },
          tableData: []
        }
      },
      created() {
        this.initDataFun() // 初始化数据
      },
      methods: {
        // 初始化数据
        initDataFun() {
          this.tableData = [
            {
              id: 1,
              url: this.defaultImg,
              code: 11,
              title0: '王小虎1',
              title1: '王小虎1',
              title2: 'wangxiaohu1'
            },
            {
              id: 2,
              url: this.defaultImg,
              code: 12,
              title0: '王小虎2',
              title1: '王小虎2',
              title2: 'wangxiaohu2'
            },
            {
              id: 3,
              url: this.defaultImg,
              code: 13,
              title0: '王小虎3',
              title1: '王小虎3',
              title2: 'wangxiaohu3'
            }
          ]
        },
        // 操作:光标点击了某个input框时,自动全选内容
        selectTableRowInputFun(refName) {
          // 传入当前点击input框的自定义拼接的ref名,方便寻找dom 
          if (this.$refs[refName]) {
            this.$refs[refName].select()
          }
        },
        // 键盘事件
        tableRowInputKeyup(e, index, titleName) {
          if (e.code === 'Tab') {
            e.preventDefault()
            let refName = ''
            switch (e.code) {
              case 'Tab':
                if (titleName === 'title0') {
                  refName = 'table' + index + 'title1'
                }
                if (titleName === 'title1') {
                  refName = 'table' + index + 'title2'
                }
                if (titleName === 'title2') {
                  refName = 'table' + (index + 1) + 'title0'
                }
                break
              default:
                break
            }
            if (this.$refs[refName]) {
              // 下一个input的dom存在,就切换到该dom
              this.$refs[refName].focus()
              this.$refs[refName].select()
            } else if (index && index === (this.tableData.length - 1)) {
              // 索引存在,但是已经是最后一个了,则又跳转到第一个input的Dom去
              refName = 'table' + 0 + 'title0'
              this.$refs[refName].focus()
              this.$refs[refName].select()
            }
          }
        },
        // 操作:详情
        toObjectItemDetail(row) {
          console.log(row)
        }
      }
    }
    </script>
    
    <style lang="less" scoped>
    .object-type-data-list-box {
      position: fixed;
      top: 100px;
      left: 100px;
      right: 100px;
      bottom: 100px;
      background-color: #fff;
      border: 1px solid #000;
      padding: 12px 12px;
      .object-type-data-list-table {
        height: calc(100vh - 200px - 24px);
        .table-row-image {
          width: 100px;
          height: 100px;
          display: flex;
          border-radius: 4px;
          border: 1px dashed #f1f1f1;
        }
        input {
          border: 1px solid #f1f1f1;
          outline: none;
          width: 100%;
          height: 40px;
          background-color: #fff;
        }
      }
    }
    </style>
    
    

    最后

    觉得有用的朋友请用你的金手指点一下赞,或者评论留言一起探讨技术!

    展开全文
  • 有时会遇到这种情况,工作簿中的自定义单元格样式非常多,需要将其全部删除,如果手动逐一操作显得有些繁琐,如下图所示的自定义单元格样式。这时用下面的VBA代码可一次删除所有的自定义单元格样式,方法如下。1、.....

    在Excel中可通过内置或自定义的单元格样式直接设置单元格格式,十分方便。而在Excel 2007/2010中,在“开始”选项卡的“样式”组中,单击“单元格样式”可在样式库中直接选择,显得更加方便。

    有时会遇到这种情况,工作簿中的自定义单元格样式非常多,需要将其全部删除,如果手动逐一操作显得有些繁琐,如下图所示的自定义单元格样式。

    75290400_1

    这时用下面的VBA代码可一次删除所有的自定义单元格样式,方法如下。

    1、按Alt+F11打开VBA编辑器,在代码窗口中输入下列代码:

    Sub DelCustomStyles()

    Dim st As Style

    For Each st In ActiveWorkbook.Styles

    If Not st.BuiltIn Then st.Delete

    Next

    End Sub

    2、关闭VBA编辑器,返回Excel界面。按Alt+F8,打开“宏”对话框,执行“DelCustomStyles”宏即可一次删除所有自定义单元格样式,而内置的单元格样式会保留,如下图。

    75290400_2

    说明:删除全部自定义单元格样式后,对于应用过这些样式的单元格或区域,其单元格格式也会同时被清除。

    来自:Excel技巧天地

    链接:http://www.excel123.cn/Article/excelvba/201203/933.html

    ●本文编号354,以后想阅读这篇文章直接输入354即可

    ●输入m可以获取到全部文章目录

    ●输入c可以获取到全部动画下载地址

    展开全文
  • JavaFX的自定义单元格可以使用cellFactory实现,但是实际使用的时候很可能会遇到各种问题,最奇怪的一点是初始设置的内容挺好的,但是表格一滚动,样式立马出错。完全不受控制了。 问题一 比如下面这样,添加一列复...

    JavaFX TableView 自定义单元格样式时注意事项

    JavaFX的自定义单元格可以使用cellFactory实现,但是实际使用的时候很可能会遇到各种问题,最奇怪的一点是初始设置的内容挺好的,但是表格一滚动,样式立马出错。完全不受控制了。

    问题一

    比如下面这样,添加一列复选框,选择了第一个后,滚动表格再回来,又取消选中状态了。

    在这里插入图片描述

    上面的情况使用的代码:

    protected void updateItem(Boolean item, boolean empty) {
        super.updateItem(item, empty);
        setText(null);
        if (empty){
            setGraphic(null);
        }else {
            CheckBox checkBox = new CheckBox();
            setGraphic(checkBox);
        }
    }
    
    

    这个updateItem方法会在表格某些行刷新的时候调用。比如,向上滚动后下面的8,9行显示出来,就会调用updateItem(),此时就是要刷新8,9行内容的时候。所以上面的代码每次都会新建一个CheckBox,而且默认都是未选中,所以当我们选择了第一行之后,再滚动表格后,就会重新创建一个CheckBox,就又变成了未选中状态。

    这时候可能有些朋友会说,那可以先判断一下啊,如果已经设置了CheckBox,就不再设置,不就可以了嘛。

    代码改造为下面这样:

    protected void updateItem(Boolean item, boolean empty) {
        super.updateItem(item, empty);
        setText(null);
        if (empty){
            setGraphic(null);
        }else {
            // 当没有设置graphic的时候,就创建,有了的话就不再创建
            if (getGraphic() == null){
                CheckBox checkBox = new CheckBox();
                setGraphic(checkBox);
            }
        }
    }
    

    结果,更奇怪的问题出来了:

    在这里插入图片描述

    我们选择第一行CheckBox,滚动表格,其他行竟然被选中了,不断滚动,选择的行也不一样,完全乱套了。这就是TableView的第二个问题导致的了。

    问题二

    说明原因之前,大家先猜一下:上面演示的TableView,总共十条数据,那么JavaFX会给他渲染几条数据呢?

    如果回答10条,那就错了。想一个极端情况,我们准备了10万条数据,加载进来的时候,直接渲染10万行数据,怕是窗口直接无响应了吧。因为JavaFX的UI线程是单线程的,他要是一个一个去渲染10万行数据,这个UI线程必定会阻塞。导致页面其他元素都不能得到足够时间渲染,窗口就会出现冻结,无法操作的现象。所以正确结果应该是8行(实际是9行,包含标题行),也就是说,TableView只会渲染当前视图出现的数据,其他数据并没有被渲染,当我们滚动表格的时候,才会即时渲染。

    每一行的数据都被包含在一个TableRow组件中。所以在我们可见的范围内,总是只有8个TableRow在渲染。那么这8个TableRow是怎么在滚动表格时显示这10条数据的呢。比如:向下滚动时,第1,2行的数据被隐藏了,那么第1,2行的TableRow就会被拿来显示第8、9行,并且位置也从第1,2行移到了第8,9行,但是TableRow里面的一些数据JavaFX并没有更新为新的8,9行,还是之前的1,2行的数据,所以我们直接从TableRow拿个别数据时就会拿到我们不想要的,但是JavaFX更新了index行号,item行对象的数据,所以getTableRow().getIndex()就是当前第8,9行,getTebleRow().getItem()就是第8,9行的对象,但是像graphics或者userData等数据还是第1,2行的所以就出错了。JavaFX TableView 行详细的变换算法其实不用关心,我们只要注意到这一点就行,平时开发的时候遇到问题知道是怎么回事,能立马解决就行了。

    所以上面的例子还得改造,既然item对象是更新了的,那么就把数据存放在item里面。

    首先,基本的User类加一个字段selected,来存储CheckBox选择状态:

    public class User {   
    	private boolean selected;
        private String name;
        ...
    }
    
    

    然后在updateItem里面获取当前行选中状态:

    protected void updateItem(Boolean item, boolean empty) {
        super.updateItem(item, empty);
        setText(null);
        if (empty){
            setGraphic(null);
        }else {
            // 首先获取当前行item数据。即:“8、9行数据”
            User user = getTableRow().getItem();
            if (user == null){
                return;
            }
            CheckBox checkBox = new CheckBox();
            // 用户初始设置的selected状态
            if (user.isSelected()){
                checkBox.setSelected(true);
            }else {
                checkBox.setSelected(false);
            }
            setGraphic(checkBox);
            // 当我们切换某一行的CheckBox选中状态后,就把状态记录到对应行的item数据中
            checkBox.selectedProperty().addListener((observable, oldValue, newValue) -> {
                if (newValue){
                    user.setSelected(true);
                }else {
                    user.setSelected(false);
                }
            });
        }
    }
    

    所以,选中还是不选中,是由行里面的item决定的,避免了把第“1,2行”的选中状态移到了第“8,9行”这种问题。

    展开全文
  • EasyExcel实现自定义单元格样式导出

    千次阅读 2021-03-25 10:10:16
    EasyExcel实现自定义单元格样式导出 需求: 计划逾期数据进行标红 导出样式: 1. 引入依赖 <!--建议不要选用此版本以下的依赖--> <dependency> <groupId>com.alibaba</groupId> <...

    EasyExcel实现自定义单元格样式导出

    需求: 计划逾期数据进行标红

    导出样式:
    在这里插入图片描述

    1. 引入依赖

     <!--建议不要选用此版本以下的依赖-->
     <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>easyexcel</artifactId>
                <version>2.2.7</version>
            </dependency>
    

    2. 创建共用的默认样式

    
        /**
         * 默认样式
         *
         * @return
         */
        public static HorizontalCellStyleStrategy defaultStyles() {
            //表头样式策略
            WriteCellStyle headWriteCellStyle = new WriteCellStyle();
            //设置表头居中对齐
            headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
            //表头前景设置淡蓝色
            headWriteCellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.getIndex());
            WriteFont headWriteFont = new WriteFont();
            headWriteFont.setBold(true);
            headWriteFont.setFontName("思源黑体");
            headWriteFont.setFontHeightInPoints((short) 14);
            headWriteCellStyle.setWriteFont(headWriteFont);
    
            //内容样式策略策略
            WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
            // 设置背景颜色白色
            contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
            // 设置垂直居中为居中对齐
            contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
            // 设置左右对齐为靠左对齐
            contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
            // 设置单元格上下左右边框为细边框
            contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
            contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
            contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
            contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
            //创建字体对象
            WriteFont contentWriteFont = new WriteFont();
            //内容字体大小
            contentWriteFont.setFontName("思源黑体");
            contentWriteFont.setFontHeightInPoints((short) 12);
            contentWriteCellStyle.setWriteFont(contentWriteFont);
            // 初始化表格样式
            HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
            return horizontalCellStyleStrategy;
        }
    

    3. 创建自定义样式拦截器(指定行样式)
    参数值(需要设置标红的行数转为map及需要的颜色index,标题需要的月份参数)

    注:明确知道第几行需要设置样式的,可以不设定参数,直接获取cell的行数==指定行进行设置样式

    /**
     * @Author wendy
     * @Date 2020/8/14 5:10 下午
     * @Desc 拦截处理单元格创建
     */
    public class CellColorSheetWriteHandler implements CellWriteHandler {
        /**
         * map
         * key:第i行
         * value:第i行中单元格索引集合
         */
        private HashMap<Integer,Integer> map;
        
        /**
         * 颜色
         */
        private Short colorIndex;
    
        /**
         * 月份
         */
        private String month;
    
        /**
         * 有参构造
         */
        public CellColorSheetWriteHandler(HashMap<Integer,Integer> map, Short colorIndex,String month) {
            this.map = map;
            this.colorIndex = colorIndex;
            this.month = month;
        }
    
        /**
         * 无参构造
         */
        public CellColorSheetWriteHandler() {
    
        }
    
        /**
         * 在创建单元格之前调用
         */
        @Override
        public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
        }
    
        /**
         * 在单元格创建后调用
         */
        @Override
        public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        }
    
        @Override
        public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
        }
    
        /**
         * 在单元上的所有操作完成后调用
         */
        @Override
        public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
            /**
             * 根据各自需求进行设置,本示例是整行设置
             */
            //当前行的第i列
            int i = cell.getColumnIndex();
            // 根据单元格获取workbook
            Workbook workbook = cell.getSheet().getWorkbook();
            if (0 == cell.getRowIndex()) {
                WriteCellStyle headWriteCellStyle = new WriteCellStyle();
                writeSheetHolder.getSheet().getRow(0).setHeight((short)(3.0*256));
                // 获取字体实例
                WriteFont headWriteFont = new WriteFont();
                //字体样式
                headWriteFont.setBold(true);
                headWriteFont.setFontHeightInPoints((short) 18);
                headWriteFont.setColor(IndexedColors.BLACK.getIndex());
                headWriteFont.setFontName("思源黑体");
                //单元格样式
                headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
                headWriteCellStyle.setWriteFont(headWriteFont);
                CellStyle cellStyle = StyleUtil.buildContentCellStyle(workbook, headWriteCellStyle);
                cell.setCellStyle(cellStyle);
                cell.setCellValue("标题" +"("+month+")");
            }
            //不处理第一行
            if (0 != cell.getRowIndex()) {
                if (1 == cell.getRowIndex()) {
                    WriteCellStyle subheadWriteCellStyle = new WriteCellStyle();
                    // 获取字体实例
                    WriteFont headWriteFont = new WriteFont();
                    //字体样式
                    headWriteFont.setBold(true);
                    headWriteFont.setFontHeightInPoints((short) 10);
                    headWriteFont.setColor(colorIndex);
                    headWriteFont.setFontName("思源黑体");
                    //单元格样式
                    subheadWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                    subheadWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
                    subheadWriteCellStyle.setWriteFont(headWriteFont);
                    CellStyle cellStyle = StyleUtil.buildContentCellStyle(workbook, subheadWriteCellStyle);
                    cell.setCellStyle(cellStyle);
                }
                Integer integers = map.get(cell.getRowIndex());
                if (integers != null && integers != 1) {
                        //设置行高
                        writeSheetHolder.getSheet().getRow(cell.getRowIndex()).setHeight((short) (1.4 * 256));
                        // 单元格策略
                        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
                        // 设置背景颜色白色
                        contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());
                        // 设置垂直居中为居中对齐
                        contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                        // 设置左右对齐为中央对齐
                        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
                        // 设置单元格上下左右边框为细边框
                        contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
                        contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
                        contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
                        contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
                        // 创建字体实例
                        WriteFont cellWriteFont = new WriteFont();
                        // 设置字体大小
                        cellWriteFont.setFontName("思源黑体");
                        cellWriteFont.setFontHeightInPoints((short) 14);
                        //设置字体颜色
                        cellWriteFont.setColor(colorIndex);
                        cellWriteFont.setBold(false);
                        //单元格颜色
                        //contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
                        contentWriteCellStyle.setWriteFont(cellWriteFont);
                        CellStyle cellStyle = StyleUtil.buildHeadCellStyle(workbook, contentWriteCellStyle);
                        //设置当前行第i列的样式
                        cell.getRow().getCell(i).setCellStyle(cellStyle);
                }
            }
        }
    }
    
    
    
    
    
    
    

    3. 导出方法(测试方法在第5步,可跳过当前)

      
    
    
    
      public void exportExcel(HttpServletResponse response, PlanManagementBasePageDTO pageDTO) {
            try {
                response.setContentType("application/vnd.ms-excel");
                response.setCharacterEncoding("utf-8");
                response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("标题", "UTF-8") + ".xlsx");
                response.setHeader("Access-Control-Expose-Headers", "Content-Disposition");
                //获取逾期数据
                List<PlanManagementExportVO> list = export(pageDTO, null);
                //装配逾期行数
                HashMap<Integer, Integer> map = expiredRowIndex(list);
                Date time = new Date(Long.parseLong(pageDTO.getExecuteDate()) * 1000);
                SimpleDateFormat format = new SimpleDateFormat("M月");
                HorizontalCellStyleStrategy horizontalCellStyleStrategy = defaultStyles();
                //设置默认样式
                ExcelWriterSheetBuilder writerSheetBuilder = EasyExcel.write(response.getOutputStream(), PlanManagementExportVO.class)
                        											  .sheet("计划管理")
                        											  .registerWriteHandler(horizontalCellStyleStrategy);
                //指定单元格样式
                CellColorSheetWriteHandler writeHandler = new CellColorSheetWriteHandler(map, IndexedColors.RED1.getIndex(), format.format(time));
                //添加样式
                writerSheetBuilder.registerWriteHandler(writeHandler);
                //导出
                writerSheetBuilder.doWrite(list);
            } catch (Exception e) {
                e.getStackTrace();
            }
        }
    
    
    
    
    	/**
    	 * 获取逾期计划数据
    	 */
        public List<PlanManagementExportVO> export(PlanManagementBasePageDTO pageDTO, String expiredTag) {
        
            List<PlanManagementExportVO>  managementExportVOS = baseMapper.getManagementList(pageDTO, expiredTag);
            if (CollectionUtils.isEmpty(managementExportVOS)) {
                return new ArrayList<>();
            }
            AtomicInteger i = new AtomicInteger(2);
            managementExportVOS.forEach(item -> {
                item.setNum(i.getAndIncrement());
            });
            return managementExportVOS;
        }
    
    
    
    
    	/**
    	 * 装配逾期标红map
    	 */
        public HashMap<Integer, Integer> expiredRowIndex(List<PlanManagementExportVO> list) {
            HashMap<Integer, Integer> map = new HashMap<>();
            map.put(1, 1);
            if (CollectionUtils.isEmpty(list)) {
                return map;
            } else {
                list.forEach(data -> {
                    if (data.getExpiredTag().equals("1")) {
                        map.put(data.getNum(), data.getNum());
                    }
                });
            }
            return map;
        }
    
    
    
    

    4. 导出实体类

    /**
     * @Author wendy
     * @Date 2021/3/1 15:55
     * @Version 1.0
     */
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    @ApiModel(value = "计划管理导出展示数据")
    //务必设置此属性,否则自定义拦截器设置的样式不起作用
    @ContentStyle(horizontalAlignment = HorizontalAlignment.CENTER, verticalAlignment = VerticalAlignment.CENTER)
    public class PlanManagementExportVO extends BaseRowModel {
    
        /**
         * 行号
         */
        @ExcelIgnore
        private int num;
    
        /**
         * 计划名称
         */
        @ApiModelProperty(value = "计划名称")
        @ExcelProperty(value = {"标题", "计划名称"}, index = 0)
        @ColumnWidth(25)
        private String planName;
    
        /**
         * 计划类型
         */
        @ApiModelProperty(value = "计划类型")
        @ExcelProperty(value = {"标题", "计划类型"}, index = 1)
        @ColumnWidth(25)
        private String planType;
    
        /**
         * 责任人员
         */
        @ApiModelProperty(value = "责任人员")
        @ExcelProperty(value = {"标题", "责任人员"}, index = 2)
        @ColumnWidth(35)
        private String personLiable;
    
    
        /**
         * 责任部门
         */
        @ApiModelProperty(value = "责任部门")
        @ExcelProperty(value = {"标题", "责任部门"}, index = 3)
        @ColumnWidth(25)
        private String liableDept;
    
    
        /**
         * 更新时间
         */
        @ApiModelProperty(value = "更新时间")
        @ExcelProperty(value = {"标题", "操作时间"}, index = 4)
        @ColumnWidth(35)
        private Date updatedTime;
    
        @ColumnWidth(15)
        @ExcelIgnore
        private String expiredTag;
    }
    
    
    
    
    

    5. 测试类

    
    
    public class Test {
        /**
         * 导出的数据集合
         */
        public static List<PlanManagementExportVO>  list;
        static {
            list = new ArrayList<>();
            Collections.addAll(list,
                    new PlanManagementExportVO(1, "华为P20", "4999.0", "上架", "华为", new Date(), "1"),
                    new PlanManagementExportVO(2, "华为P30", "5999.0", "上架", "华为", new Date(), "2"),
                    new PlanManagementExportVO(3, "华为P40", "6999.0", "上架", "华为", new Date(), "0"),
                    new PlanManagementExportVO(4, "华为P50", "7999.0", "上架", "华为", new Date(), "1"),
                    new PlanManagementExportVO(5, "华为P60", "8999.0", "上架", "华为", new Date(), "1"),
                    new PlanManagementExportVO(6, "华为P70", "9999.0", "上架", "华为", new Date(), "1")
            );
        }
    
        public static void main(String[] args) {
            String fileName = null ;
            try {
               fileName = URLEncoder.encode(new SimpleDateFormat("yyyy-MM-dd-24h").format(new Date()) + ".xlsx", "UTF-8");
            }catch (Exception e){
                e.getStackTrace();
            }
            //HorizontalCellStyleStrategy horizontalCellStyleStrategy = defaultStyles();
            //设置默认样式
            ExcelWriterSheetBuilder writerSheetBuilder = EasyExcel.write(fileName, PlanManagementExportVO.class)
                                                                  .sheet("计划管理")
                                                                  .registerWriteHandler(defaultStyles());
            //用来记录需要为第`key`行中的第`value.get(i)`列设置样式
            HashMap<Integer,Integer > map = new HashMap<>();
            map.put(1,1);
            map.put(2,2);
            map.put(4,4);
            //指定单元格样式
            CellColorSheetWriteHandler writeHandler = new CellColorSheetWriteHandler(map, IndexedColors.RED1.getIndex());
            //添加样式
            writerSheetBuilder.registerWriteHandler(writeHandler);
            //导出
            writerSheetBuilder.doWrite(list);
        }
    
    
    
    

    测试类导出文件在服务内部
    在这里插入图片描述

    指定单元格导出样式

    在这里插入图片描述

    自定义样式拦截器

    /**
     * @Author wendy
     * @Date 2020/8/14 5:10 下午
     * @Desc 拦截处理单元格创建
     */
    public class CellColorSheetWriteHandler implements CellWriteHandler {
        /**
         * map
         * key:第i行
         * value:第i行中单元格索引集合
         */
        private HashMap<Integer,Integer> map;
        
        /**
         * 颜色
         */
        private Short colorIndex;
    
        /**
         * 月份
         */
        private String month;
    
        /**
         * 有参构造
         */
        public CellColorSheetWriteHandler(HashMap<Integer,Integer> map, Short colorIndex,String month) {
            this.map = map;
            this.colorIndex = colorIndex;
            this.month = month;
        }
    
        /**
         * 无参构造
         */
        public CellColorSheetWriteHandler() {
    
        }
    
        /**
         * 在创建单元格之前调用
         */
        @Override
        public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
        }
    
        /**
         * 在单元格创建后调用
         */
        @Override
        public void afterCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
        }
    
        @Override
        public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
        }
    
        /**
         * 在单元上的所有操作完成后调用
         */
        @Override
        public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List<CellData> cellDataList, Cell cell, Head head, Integer relativeRowIndex, Boolean isHead) {
    
            /**
             * 考虑到导出数据量过大的情况,不对每一行的每一个单元格进行样式设置,只设置必要行中的某个单元格的样式
             */
            //当前行的第i列
            int i = cell.getColumnIndex();
            // 根据单元格获取workbook
            Workbook workbook = cell.getSheet().getWorkbook();
            if (0 == cell.getRowIndex()) {
                WriteCellStyle headWriteCellStyle = new WriteCellStyle();
                // 获取字体实例
                WriteFont headWriteFont = new WriteFont();
                //字体样式
                headWriteFont.setBold(true);
                headWriteFont.setFontHeightInPoints((short) 18);
                headWriteFont.setColor(IndexedColors.BLACK.getIndex());
                headWriteFont.setFontName("微软雅黑");
                //单元格样式
                headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
                headWriteCellStyle.setWriteFont(headWriteFont);
                CellStyle cellStyle = StyleUtil.buildContentCellStyle(workbook, headWriteCellStyle);
                cell.setCellStyle(cellStyle);
            }
            //不处理第一行
            if (0 != cell.getRowIndex()) {
                Integer integers = map.get(cell.getRowIndex());
                if (integers != null && integers != 0) {
                   if (integers.equals(i)) {
                    //设置行高
                    writeSheetHolder.getSheet().getRow(cell.getRowIndex()).setHeight((short) (1.4 * 256));
                    // 单元格策略
                    WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
                    // 设置背景颜色白色
                    contentWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE1.getIndex());
                    // 设置垂直居中为居中对齐
                    contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
                    // 设置左右对齐为中央对齐
                    contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
                    // 设置单元格上下左右边框为细边框
                    contentWriteCellStyle.setBorderBottom(BorderStyle.THIN);
                    contentWriteCellStyle.setBorderLeft(BorderStyle.THIN);
                    contentWriteCellStyle.setBorderRight(BorderStyle.THIN);
                    contentWriteCellStyle.setBorderTop(BorderStyle.THIN);
                    // 创建字体实例
                    WriteFont cellWriteFont = new WriteFont();
                    // 设置字体大小
                    cellWriteFont.setFontName("微软雅黑");
                    cellWriteFont.setFontHeightInPoints((short) 12);
                    //设置字体颜色
                    cellWriteFont.setColor(colorIndex);
                    //单元格颜色
                    //contentWriteCellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
                    contentWriteCellStyle.setWriteFont(cellWriteFont);
                    CellStyle cellStyle = StyleUtil.buildHeadCellStyle(workbook, contentWriteCellStyle);
                    //设置当前行第i列的样式
                    cell.getRow().getCell(i).setCellStyle(cellStyle);
                       }
                }
            }
        }
    }
    
    • 感谢您的阅读。如果感觉文章对您有用,麻烦您动动手指点个赞,以资鼓励。谢谢!

    在这里插入图片描述

    展开全文
  • 主要是表格信息 在vue官网上没有找到这种整个表格一起提交的,所以就按照自己的想法弄了一下,也是刚开始学vue,不知道写法好不好,具体写法如下: 表格中的每个单元格都是用模板定义的, slot : 跟jQuery的Id差不多, ...
  • 单元格:通过给数据 data 设置字段 cellClassName 可以给任意一个单元格指定样式。 1.初始化 tableColumns: [ { title: "客户", key: 'companyName' }, { title: "区域", key: 'region' }, { title: "操作...
  • 项目场景: 用日历显示日志状态 ...官方给的文档每个日期渲染的单元格数据是无状态的,可以把dateCellRender函数设置成一个有状态的组件,当数据变化时,在重新render 下面是一个简单的示例代码 ...
  • 效果 判断数据的值修改显示字体的颜色 在使用 columns 时,可以通过scopedSlots属性配置支持 slot-scope 的属性。 ...a-table :columns="columns" :data-source="data" :scroll="{ x: 1500,y:400}" rowKey="序号...
  • 我有一个自定义单元格渲染器为单元格做一个单词包装,所以更多的内容可以读取.这是代码:import java.awt.Color;import java.awt.Component;import java.awt.Insets;import javax.swing.JTable;import javax.swing....
  • easyexcel的版本不同,单元格合并策略实现的方法不同,所以能需要拷贝工具类的小伙伴,导入对应的maven包 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</...
  • 有时候前台完成某个操作后要修改datagrid的值...这些情况都需要前台对datagrid的单元格进行修改操作:假设我们有一个” staffLogDetailGrid”的datagrid;// 得到columns对象var columns = $('#dg').datagrid("options...
  • XSSFCellStyle 自定义单元格背景颜色 此代码可用于2007(xlsx)之后的版本使用。 XSSFWorkbook wb = new XSSFWorkbook();//此行代码可以忽略 XSSFCellStyle style = wb.createCellStyle();//创建一个单元格style ...
  • 代码如下: { field: 'addrId', title: '收货地址', }, { fixed: 'right', title: '操作', width: ... }) 我们监听class点击事件,使用$(this).data('xxxx')获取自定义的数据,再拿数据进行其他操作就好了。 — END —
  • 纵向表头和横向表头 默认处理的是横向的表头,也就是表头在上方,数据在下方。 如果想要处理纵向表头,建议将纵向的表头...只要这个单元格标题和对应注解的信息是相同即可 通过注解和工具类将,excel的数据并转换为Li
  • '0311-89880704','中国建设银行股份有限公司石家庄建华南大街支行','13050161580100001338','liux117','13833173386','', 0, '' 单元格公式: =($P5 &1&"," &"'" &L5& "'," & "'" &J5& "'," & "new date()" & ","&...
  • } } /** * 填充excel数据 * * @param headers 标题集合 * @param dataList 内容集合 * @param mergeColumns 合并单元格的列 */ private static <T> void createExcel(List<String> headers, List<String> filedName...
  • I want to set custom color to a cell's background.I use HSSFWorkbook (can't use anything else).HSSFPalette palette = aWorkBook.getCustomPalette();Color col = new Color(backgroundColor);...
  • easyexcel body自定义单元格合并,自定义列宽body 自定义单元格合并AbstractMergeStrategy的实现自定义合并的使用自定义列宽实现AbstractHeadColumnWidthStyleStrategy类自定义列宽的使用 body 自定义单元格合并 ...
  • 根据业务需求会有导出中需要合并的功能,但是当根据数据合并时又不能使用注解来进行合并,只能自定义合并,根据官网中介绍可以使用第二种方式,官网地址https://www.yuque.com/easyexcel/doc/write#cac25459 ...
  • import java.awt.BorderLayout;import java.awt.Component;import java.awt.Dimension;import java.awt.Rectangle;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.awt.event....
  • 自定义格式:自定义格式主要说两点:1、创建或删除自定义数字格式,2、条件格式,因为这一部分在Excel的帮助中的解释已非常清楚,就将帮助的内容复制于此创建自定义数字格式选择要设置格式的单元格。在“格式”菜单...
  • 自定义格式:自定义格式主要说两点:1、创建或删除自定义数字格式,2、条件格式,因为这一部分在Excel的帮助中的解释已非常清楚,就将帮助的内容复制于此创建自定义数字格式选择要设置格式的单元格。在“格式”菜单...
  • 如何在Excel的单元格中将HTML转换为文本?如下面的屏幕截图所示,如果工作表单元格中存在许多html标记,那么如何在Excel中将它们转换为纯文本? 本文将向您展示两种从Excel单元格中删除所有html标记的方法。使用查找...
  • 它不具有约束力,但您可以通过逻辑创建自己的自定义列来设置背景颜色并替换自动生成的颜色 .XAML:代码背后:private void grid_AutoGeneratedColumns(object sender, EventArgs e){var columnsToReplace = new List...
  • 最近做个表格,想做隔行换色以及自定义单元格数据展示的效果,到网上找了一些方法,算是大概实现了,记录一下。(总结还是一句话,多看API文档)table页面展示constructor() {...this.columns = [{title: 'Research ...
  • 你得到这个错误,因为pallete已满。您需要做的是覆盖预设颜色。这是我使用的函数的一个例子:public HSSFColor setColor(HSSFWorkbook workbook, byte r,byte g, byte b){HSSFPalette palette = workbook....
  • 红框内容:表头嵌套,通过el-table-column嵌套即可实现; 蓝框内容:左侧为表头跨列;右侧为表头跨行。(右侧效果:如果用el-table-column嵌套,会造成"考试结果"占一行,"成绩"占两行。)我的方案有些繁琐,先通过...
  • "g").Resize(1, 5) = Rng.EntireRow.Range("a1:e1").Value End If Next 2、获取指定杭内容 'On Error Resume Next Application.ScreenUpdating = False 'MP = ActiveWorkbook.Path MP = "C:\Users\HONORS\Desktop\...
  • easyExcel导出自定义表头 1、自定义拦截器,写入头部样式 public class CustomCellWriteHandler extends AbstractCellStyleStrategy implements CellWriteHandler { Workbook workbook; @Override public void ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 59,270
精华内容 23,708
关键字:

如何自定义单元格内容