精华内容
下载资源
问答
  • 根据后端返回的数据 (res 是一数组,它的元素是一个对象对象里面的ext属性是一个对象,它又包含了,default、free和pay三属性,且这三都是数组格式。): 渲染出一这样子的 表格 : res数据: res的...

    一、分析需求

    • 这里先上一张图说明 需求

    根据后端返回的数据 (res 是一个数组,它的元素是一个对象,对象里面的ext属性是一个对象,它又包含了,defaultfreepay三个属性,且这三个都是数组格式。):
    在这里插入图片描述

    • 渲染出一个这样子的 表格

    res数据:

    1. res的每一个元素的直接属性name (即为邮费模板名称,比如成都运费模板),
    2. resext属性下的三个数组 defaultfreepay,每一个数组要大的一行(这一行中,第一列是运送到的地址的名字,这里定义的是area属性,但后端是未给到这个字段的,可自己处理数据添加该字段 ,这里就不细说了。) 这个area属性占据的这一列,在页面的展示效果 应该是多行合并的效果。在这里插入图片描述

    二、代码实现:

    <template>
        <div class="layout">
          <el-table :data="res" >
            <el-table-column prop="name">
              <template slot-scope="scope">
                <div class="tab_header">
                  <span style="font-weight:600;">{{scope.row.name}}</span>
                  <div class="operate">
                    <span @click="handleEdit(scope.$index, scope.row)">修改</span>
                    <span @click="handleDelete(scope.$index, scope.row)">删除</span>
                  </div>
                </div>
    
                <!-- 这里要实现 多个表格共用一个表头,故需做判断,当表格要渲染的数据为default这个数组的时候,才显示表头的label值 -->
                <!-- 注意:当label无值的时候,还是会占用空间,故当前表格在页面上会出现一个代表表头的空行,需要手动更改(重写)Element表格的 thead样式 -->
    
                <div v-for="item in (scope.row.ext)" :key="item.id">
                  <el-table :data="item" border :class="item!==scope.row.ext.default?'tab-thead-style':''"  style="box-sizing: border-box;border-top:none;" :span-method="objectSpanMethod">
                    <el-table-column :label="item===scope.row.ext.default?'运送到':''" prop="area"></el-table-column>
                    <el-table-column :label="item===scope.row.ext.default?'首重':''" prop="weight"></el-table-column>
                    <el-table-column :label="item===scope.row.ext.default?'运费':''"   prop="first_price"></el-table-column>
                    <el-table-column :label="item===scope.row.ext.default?'续重':''"  prop="weight_incre"></el-table-column>
                    <el-table-column :label="item===scope.row.ext.default?'最终运费':''"  prop="extend_price"></el-table-column>
                  </el-table>
                </div>
    
              </template>
            </el-table-column>
          </el-table>
        </div>
    </template>
    <script>
    export default {
      data () {
        return {
          // res 参考的是后端返回的数据格式,
          res: [
            {
              id: 1,
              dealer_id: 0,
              name: '成都运费模板',
              type: 1,
              ext: {
                default: [{ area: '默认', type: 1, region: '1', weight: '首重d', weight_incre: '续重d', first_price: '运费d', extend_price: '最终运费d' }],
                free: [{ area: 'free', type: 1, region: '1', weight: '首重f', weight_incre: '续重f', first_price: '运费f', extend_price: '最终运费f' }, { area: 'free', type: 1, region: '1', weight: '首重f', weight_incre: '续重f', first_price: '运费f', extend_price: '最终运费f' }],
                pay: [{ area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }]
              }
            },
            {
              id: 2,
              dealer_id: 0,
              name: '重庆运费模板',
              type: 2,
              ext: {
                default: [{ area: '默认1', type: 1, region: '1', weight: '首重d', weight_incre: '续重d', first_price: '运费d', extend_price: '最终运费d' }],
                free: [{ area: 'free1', type: 1, region: '1', weight: '首重f', weight_incre: '续重f', first_price: '运费f', extend_price: '最终运费f' }, { area: 'free', type: 1, region: '1', weight: '首重f', weight_incre: '续重f', first_price: '运费f', extend_price: '最终运费f' }],
                pay: [{ area: 'pay1', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay1', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }, { area: 'pay', type: 1, region: '1', weight: '首重p', weight_incre: '续重p', first_price: '运费p', extend_price: '最终运费p' }]
              }
            }
    
          ]
        }
      },
      methods: {
        handleEdit (index, row) {
          console.log(index, row)
        },
        handleDelete (index, row) {
          console.log(index, row)
        },
        objectSpanMethod ({ row, column, rowIndex, columnIndex }) {
          if (columnIndex === 0) {
            if (rowIndex === 0) {
              let maxLen
              this.res.forEach(val => {
                const arr = [val.ext.default.length, val.ext.free.length, val.ext.pay.length]
                arr.sort((a, b) => a - b)// arr数组  按数字大小从小到大排序
                maxLen = arr.pop()// 取出排序后的数组arr中的最后一个元素
              })
              return {
                // 这个rowspan应该据 ext的default,pay,free的长度不同来定,取最大长度
                rowspan: maxLen,
                colspan: 1
              }
            } else {
              return {
                rowspan: 0,
                colspan: 0
              }
            }
          }
        }
      }
    }
    </script>
    <style lang="scss">
    .layout{
    
      .tab_header{
       color:#333;
       padding:0 5px 0 5px;
       height:45px;
       line-height:45px;
       border:1px solid #eee;display:flex;
       justify-content: space-between;
       background:rgb(233, 225, 225);
      }
      .operate{
        span{
          font-size: 14px;
          margin-right: 20px;
          margin-right:20px;
          color:#409EFF;
          cursor: pointer;
        }
      }
      /* 处理多个表格共用一个表头时,表头处出现多余空行的问题 (label置空后还是占据空间问题) */
      .tab-thead-style{
          thead{
              display: none;
          }
      }
    
    }
    </style>
    
    
    

    在这里插入图片描述

    三、知识点总结:

    • 为什么要采用这种方式解决(渲染)?

      ① . 项目用的UI组件是Element,它的Table表格组件,没有直接处理行的操作。

      ② . el-table,它是通过注入data对象数组,并在el-table-column 中用prop属性来对应对象中的键名来填入数据,从而渲染出渲染表格。其中el-table-column表示一个列,label属性来定义表格的列名,即对象的一个键名代表一列;

      ③ . 没想到更优的解决办法,O(∩_∩)O哈哈~

    • 多个表格共用一个表头时,注意:

      ①. 需做判断,同时注意label的值。

      ②.el-table-column 的属性label无值的时候,还是会占用空间,故当前表格在页面上会出现一个代表表头的空行,需要手动更改(重写)Element表格的 thead样式

    • table表格嵌套的时候,注意:

      ① . ElementTable组件可 自定义列模板,主要是利用它实现表格嵌套部分,通过 Scoped slot 可以获取到 row, column, $indexstore(table 内部的状态管理)的数据,更多用法参考官网

      ②. ElementTable组件可 合并行或列 ,多行或多列共用一个数据时,可以合并行或列;通过给table传入span-method方法可以实现合并行或列,参考上述代码的 **objectSpanMethod**方法(该表格的第一列需要合并多行——合并渲染表格的data数组的长度那么多行) 或者官网。

    后期更新

     **`更新:`**
    

    代码实现处,基本思路是对的,但绑定tab-thead-style类以及用三元运算符确定label的地方实属没必要,这里的本质是 是否展示表头的问题,用show-header属性即可实现,之前没细看文档,别像我学习emo。。。 所以现将代码实现更改如下:

    1. 去除了tab-thead-style类名的定义和class的绑定
    2. 去除了label相关的判定
    3. 给table增加了 show-header的属性,true,显示表头,false则不显示表头。
    <template>
      <div class="layout">
        <el-table :data="res">
          <el-table-column prop="name">
            <template slot-scope="scope">
              <div class="tab_header">
                <span style="font-weight: 600">{{ scope.row.name }}</span>
                <div class="operate">
                  <span @click="handleEdit(scope.$index, scope.row)">修改</span>
                  <span @click="handleDelete(scope.$index, scope.row)">删除</span>
                </div>
              </div>
    
              <!-- 这里要实现 多个表格共用一个表头,故需做判断,当表格要渲染的数据为default这个数组的时候,才显示表头的label值,即显示表头,设置show-header属性为true -->
              <div v-for="item in scope.row.ext" :key="item.id">
                <el-table
                  :data="item"
                  border
                  :class="item !== scope.row.ext.default ? 'tab-thead-style' : ''"
                  style="box-sizing: border-box; border-top: none"
                  :span-method="objectSpanMethod"
                  :show-header="item === scope.row.ext.default"
                >
                  <el-table-column label="运送到" prop="area"></el-table-column>
                  <el-table-column label="首重" prop="weight"></el-table-column>
                  <el-table-column
                    label="运费"
                    prop="first_price"
                  ></el-table-column>
                  <el-table-column
                    label="续重"
                    prop="weight_incre"
                  ></el-table-column>
                  <el-table-column
                    label="最终运费"
                    prop="extend_price"
                  ></el-table-column>
                </el-table>
              </div>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </template>
    <script>
    export default {
      data() {
        return {
          // res 参考的是后端返回的数据格式,
          res: [
            {
              id: 1,
              dealer_id: 0,
              name: '成都运费模板',
              type: 1,
              ext: {
                default: [
                  {
                    area: '默认',
                    type: 1,
                    region: '1',
                    weight: '首重d',
                    weight_incre: '续重d',
                    first_price: '运费d',
                    extend_price: '最终运费d',
                  },
                ],
                free: [
                  {
                    area: 'free',
                    type: 1,
                    region: '1',
                    weight: '首重f',
                    weight_incre: '续重f',
                    first_price: '运费f',
                    extend_price: '最终运费f',
                  },
                  {
                    area: 'free',
                    type: 1,
                    region: '1',
                    weight: '首重f',
                    weight_incre: '续重f',
                    first_price: '运费f',
                    extend_price: '最终运费f',
                  },
                ],
                pay: [
                  {
                    area: 'pay',
                    type: 1,
                    region: '1',
                    weight: '首重p',
                    weight_incre: '续重p',
                    first_price: '运费p',
                    extend_price: '最终运费p',
                  },
                  {
                    area: 'pay',
                    type: 1,
                    region: '1',
                    weight: '首重p',
                    weight_incre: '续重p',
                    first_price: '运费p',
                    extend_price: '最终运费p',
                  },
                  {
                    area: 'pay',
                    type: 1,
                    region: '1',
                    weight: '首重p',
                    weight_incre: '续重p',
                    first_price: '运费p',
                    extend_price: '最终运费p',
                  },
                ],
              },
            },
            {
              id: 2,
              dealer_id: 0,
              name: '重庆运费模板',
              type: 2,
              ext: {
                default: [
                  {
                    area: '默认1',
                    type: 1,
                    region: '1',
                    weight: '首重d',
                    weight_incre: '续重d',
                    first_price: '运费d',
                    extend_price: '最终运费d',
                  },
                ],
                free: [
                  {
                    area: 'free1',
                    type: 1,
                    region: '1',
                    weight: '首重f',
                    weight_incre: '续重f',
                    first_price: '运费f',
                    extend_price: '最终运费f',
                  },
                  {
                    area: 'free',
                    type: 1,
                    region: '1',
                    weight: '首重f',
                    weight_incre: '续重f',
                    first_price: '运费f',
                    extend_price: '最终运费f',
                  },
                ],
                pay: [
                  {
                    area: 'pay1',
                    type: 1,
                    region: '1',
                    weight: '首重p',
                    weight_incre: '续重p',
                    first_price: '运费p',
                    extend_price: '最终运费p',
                  },
                  {
                    area: 'pay',
                    type: 1,
                    region: '1',
                    weight: '首重p',
                    weight_incre: '续重p',
                    first_price: '运费p',
                    extend_price: '最终运费p',
                  },
                  {
                    area: 'pay',
                    type: 1,
                    region: '1',
                    weight: '首重p',
                    weight_incre: '续重p',
                    first_price: '运费p',
                    extend_price: '最终运费p',
                  },
                  {
                    area: 'pay1',
                    type: 1,
                    region: '1',
                    weight: '首重p',
                    weight_incre: '续重p',
                    first_price: '运费p',
                    extend_price: '最终运费p',
                  },
                  {
                    area: 'pay',
                    type: 1,
                    region: '1',
                    weight: '首重p',
                    weight_incre: '续重p',
                    first_price: '运费p',
                    extend_price: '最终运费p',
                  },
                  {
                    area: 'pay',
                    type: 1,
                    region: '1',
                    weight: '首重p',
                    weight_incre: '续重p',
                    first_price: '运费p',
                    extend_price: '最终运费p',
                  },
                ],
              },
            },
          ],
        }
      },
      methods: {
        handleEdit(index, row) {
          console.log(index, row)
        },
        handleDelete(index, row) {
          console.log(index, row)
        },
        objectSpanMethod({ row, column, rowIndex, columnIndex }) {
          if (columnIndex !== 0) return
          if (rowIndex !== 0) {
            return {
              rowspan: 0,
              colspan: 0,
            }
          }
    
          let maxLen
          this.res.forEach((val) => {
            const arr = [
              val.ext.default.length,
              val.ext.free.length,
              val.ext.pay.length,
            ]
            arr.sort((a, b) => a - b) // arr数组  按数字大小从小到大排序
            maxLen = arr.pop() // 取出排序后的数组arr中的最后一个元素
          })
          return {
            // 这个rowspan应该据 ext的default,pay,free的长度不同来定,取最大长度
            rowspan: maxLen,
            colspan: 1,
          }
        },
      },
    }
    </script>
    <style lang="scss">
    .layout {
      .tab_header {
        color: #333;
        padding: 0 5px 0 5px;
        height: 45px;
        line-height: 45px;
        border: 1px solid #eee;
        display: flex;
        justify-content: space-between;
        background: rgb(233, 225, 225);
      }
      .operate {
        span {
          font-size: 14px;
          margin-right: 20px;
          margin-right: 20px;
          color: #409eff;
          cursor: pointer;
        }
      }
    }
    </style>
    
    

    在这里插入图片描述

    展开全文
  • 个表格,类似于下图,选中以后,做成纯前端批量删除 数据源 arr2是全部的数据,arr1是勾选的数据 let arr1 = [ { code: "123456781",color: "芭比粉"}, { code: "123456783",...

    由对象组成的数组 对照删除

    一个表格,类似于下图,选中以后,做成纯前端批量删除

    在这里插入图片描述

    数据源

    arr2是全部的数据,arr1是勾选的数据
    		let arr1 = [
              { code: "123456781",color: "芭比粉"},
              { code: "123456783",color: "芭比粉"},
              { code: "123456785",color: "芭比粉"}
            ];
            let arr2 = [
              { code: "123456781",color: "芭比粉"},
              { code: "123456782",color: "芭比粉"},
              { code: "123456783",color: "芭比粉"},
              { code: "123456784",color: "芭比粉"},
              { code: "123456785",color: "芭比粉"},
              { code: "123456786",color: "芭比粉"}
            ]
    

    简单写法

    		/*
            *     	every方法,只要有一项不满足条件就返回false,也就是说必须每一项都得满足才能返回true。返回的是布尔值。
            * 		filter方法,只要条件满足,我就将此元素返回出去,返回的是元素。
            *   	在本示例中,只要arr1中存在与arr2中相同的元素,我就返回false。也就是说,我拿着arr2中
            *  的第一项去和arr1中的每一项去比较,如果code都不相等,满足所有条件,我就返回true。
            *       在filter中,只要条件为true,我就将这一项返回出去,就实现了批量删除的效果。
            */
            let arr3 = arr2.filter(item=>{
                return arr1.every(item2=>{
                    return item.code != item2.code;
                })
            })
            
            console.log(arr1,'arr1');
            console.log(arr2,'arr2');
            console.log(arr3,'arr3');
    

    在这里插入图片描述

    for循环写法,因为arr2会改变,所以采用倒序的方法,也可以重新定义一个变量,来保存arr2,不过得是深拷贝才好。

    		for(let i = arr2.length - 1; i >= 0; i--){
               for(let j = 0; j < arr1.length;j++){
                   if(arr2[i].code == arr1[j].code){
                       arr2.splice(i,1);
                   }
                }
             }
             console.log(arr1,'arr1');
             console.log(arr2,'arr2');
    

    在这里插入图片描述

    总结

    一个是考察 every 和 filter 的用法,every 是必须所有项都满足条件才返回true,返回的是布尔值,filter 是返回满足条件的元素,返回的是元素。顺便说一下 some ,他和 every 相反,只要有一个满足条件,就返回true。另一个是for循环和深拷贝或浅拷贝的问题。

    展开全文
  • 32# 我们可以利用上述创建的sheet表对象,对每一sheet表进行操作; 33fh.sheets()[0].nrows # 结果是:4 34fh.sheets()[0].ncols # 结果是:3 35 365)row_values(行数):获取每一sheet表中每一行的数据;...

    640?wx_fmt=png

    作者:黄伟

    一、相关知识点讲解

    1、需要使用的相关库

    1import numpy as np
    2import pandas as pd
    3import os
    

    2、os.walk(pwd)

    640?wx_fmt=png

    举例如下

    640?wx_fmt=png

    ② 代码操作如下:

    1pwd = "G:\\a"
    2print(os.walk(pwd))
    3for i in os.walk(pwd):
    4    print(i)
    5for path,dirs,files in os.walk(pwd):
    6    print(files)
    

    ③ 结果如下:

    1<generator object walk at 0x0000029BB5AEAB88>
    2('G:\\a', [], ['aa.txt', 'bb.xlsx', 'cc.txt', 'dd.docx'])
    3['aa.txt', 'bb.xlsx', 'cc.txt', 'dd.docx']
    

    3、os.path.join(path1,path2…)

    作用:将多个路径组合后返回

    举例如下

    1path1 = 'G:\\a'
    2path2 = 'aa.txt'
    3print(os.path.join(path1,path2))
    

    结果如下:

    1G:\a\aa.txt
    

    4、案例解析

    640?wx_fmt=png

    举例如下:

    1pwd = "G:\\a"
    2file_path_list = []
    3for path,dirs,files in os.walk(pwd):
    4    for file in files:
    5        file_path_list.append(os.path.join(pwd,file))
    6print(file_path_list)
    

    结果如下:

    1['G:\\a\\aa.txt','G:\\a\\bb.xlsx','G:\\a\\cc.txt','G:\\a\\dd.docx']
    

    5、怎么在一个列表中存放多个DataFrame数据。

    1# 先使用如下代码创建两个DataFrame数据源。
    2import numpy as np
    3xx = np.arange(15).reshape(5,3)
    4yy = np.arange(1,16).reshape(5,3)
    5xx = pd.DataFrame(xx,columns=["语文","数学","外语"])
    6yy = pd.DataFrame(yy,columns=["语文","数学","外语"])
    7print(xx)
    8print(yy)
    

    结果如下:

    640?wx_fmt=png

    怎么讲上述两个DataFrame拼接在一起?

     1concat_list = []
     2concat_list.append(xx)
     3concat_list.append(yy)
     4# pd.concat(list)中【默认axis=0】默认的是数据的纵向合并。
     5# pd.concat(list)括号中传入的是一个DataFrame列表。
     6# ignore_list=True表示忽略原有索引,重新生成一组新的索引。
     7z = pd.concat(concat_list,ignore_list=True)
     8print(z)
     9
    10# 或者直接可以写成z = pd.concat([xx,yy],ignore_list=True)
    

    结果如下:

    640?wx_fmt=png

    二、多工作簿合并(一)

    1、将多个Excel合并到一个Excel中(每个Excel中只有一个sheet表)

    640?wx_fmt=png

    操作如下:

     1import pandas as pd
     2import os
     3pwd = "G:\\b"
     4df_list = []
     5for path,dirs,files in os.walk(pwd):
     6    for file in files:
     7        file_path = os.path.join(path,file)                        
     8        df = pd.read_excel(file_path) 
     9        df_list.append(df)
    10result = pd.concat(df_list)
    11print(result)
    12result.to_excel('G:\\b\\result.xlsx',index=False)
    

    结果如下:

    640?wx_fmt=png

    三、多工作簿合并(二)

    1、相关知识点讲解

    xlsxwrite的用法

     11)创建一个"工作簿",此时里面会默认生成一个名叫"Sheet1"的Sheet表。
     2import xlsxwriter
     3# 这一步相当于创建了一个新的"工作簿";
     4# "demo.xlsx"文件不存在,表示新建"工作簿";
     5# "demo.xlsx"文件存在,表示新建"工作簿"覆盖原有的"工作簿";
     6workbook = xlsxwriter.Workbook("demo.xlsx")
     7# close是将"工作簿"保存关闭,这一步必须有。否则创建的文件无法显示出来。
     8workbook.close()  
     92)创建一个"工作簿"并添加一个"工作表",工作表命名为"2018年销量"。
    10import xlsxwriter
    11workbook = xlsxwriter.Workbook("cc.xlsx")
    12worksheet = workbook.add_worksheet("2018年销售量")
    13workbook.close()   
    

    结果如下:

    640?wx_fmt=png
     
     13)给"2018年销售量"工作表创建一个表头,向其中插入一条数据。
     2import xlsxwriter
     3# 创建一个名为【demo.xlsx】工作簿;
     4workbook = xlsxwriter.Workbook("demo.xlsx")
     5# 创建一个名为【2018年销售量】工作表;
     6worksheet = workbook.add_worksheet("2018年销售量")
     7# 使用write_row方法,为【2018年销售量】工作表,添加一个表头;
     8headings = ['产品','销量',"单价"] 
     9worksheet.write_row('A1',headings)
    10# 使用write方法,在【2018年销售量】工作表中插入一条数据;
    11# write语法格式:worksheet.write(行,列,数据) 
    12data = ["苹果",500,8.9]
    13for i in range(len(headings)):
    14    worksheet.write(1,i,data[i]) 
    15workbook.close()
    

    结果如下:

    640?wx_fmt=png

    其他用法可以参考:https://www.cnblogs.com/brightbrother/p/8671077.html

    xlrd的用法

    640?wx_fmt=png
     
     11)打开某一个存在的excel文件,返回给我们"xlrd.book.Book"工作簿对象;
     2# 这里所说的"打开"并不是实际意义上的打开,只是将该表加载到内存中打开。
     3# 我们并看不到"打开的这个效果"
     4# 以打开上述创建的"test.xlsx"文件为例;
     5import xlrd 
     6file = r"G:\Jupyter\test.xlsx"
     7xlrd.open_workbook(file)
     8# 结果如下:
     9<xlrd.book.Book at 0x29bb8e4eda0>
    10
    112)sheet_names():获取所有的sheet表表名,假如有多个sheet表,返回一个列表;
    12import xlrd
    13file = r"G:\Jupyter\test.xlsx"
    14fh = xlrd.open_workbook(file)
    15fh.sheet_names()
    16# 结果如下:
    17['2018年销售量', '2019年销售量']
    18
    193)sheets()方法:返回的是sheet表的对象列表。
    20# 返回sheet表的对象列表
    21fh.sheets()
    22# 结果如下:
    23[<xlrd.sheet.Sheet at 0x29bb8f07a90>, <xlrd.sheet.Sheet at 0x29bb8ef1390>]
    24
    25# 可以利用索引,获取每一个sheet表的对象
    26fh.sheets()[0]
    27结果是:<xlrd.sheet.Sheet at 0x29bb8f07a90>
    28fh.sheets()[1]
    29结果是:<xlrd.sheet.Sheet at 0x29bb8ef1390>
    30
    314)返回每一个sheet表的行数(nrows) 和 列数(ncols);
    32# 我们可以利用上述创建的sheet表对象,对每一个sheet表进行操作;
    33fh.sheets()[0].nrows  # 结果是:4
    34fh.sheets()[0].ncols  # 结果是:3
    35
    365)row_values(行数):获取每一个sheet表中每一行的数据;
    37sheet1 = fh.sheets()[0]
    38for row in range(fh.sheets()[0].nrows):
    39   value = sheet1.row_values(row)
    40   print(value)
    

    结果如下:

    640?wx_fmt=png
     
    16)col_values(列数):获取每一个sheet表中每一列的数据;
    2sheet1 = fh.sheets()[0]
    3for col in range(fh.sheets()[0].ncols):
    4   value = sheet1.col_values(col)
    5   print(value)
    

    结果如下:

    640?wx_fmt=png

    2、将多个Excel合并到一个Excel中(每个Excel中不只一个sheet表)

    640?wx_fmt=png
     
     1import xlrd
     2import xlsxwriter
     3import os
     4
     5# 打开一个Excel文件,创建一个工作簿对象
     6def open_xlsx(file):
     7    fh=xlrd.open_workbook(file)
     8    return fh
     9
    10# 获取sheet表的个数
    11def get_sheet_num(fh):
    12    x = len(fh.sheets())
    13    return x
    14
    15# 读取文件内容并返回行内容
    16def get_file_content(file,shnum):
    17    fh=open_xlsx(file)
    18    table=fh.sheets()[shnum]
    19    num=table.nrows
    20    for row in range(num):
    21        rdata=table.row_values(row)
    22        datavalue.append(rdata)
    23    return datavalue
    24
    25def get_allxls(pwd):
    26    allxls = []
    27    for path,dirs,files in os.walk(pwd):
    28        for file in files:
    29            allxls.append(os.path.join(path,file))
    30    return allxls
    31
    32# 存储所有读取的结果
    33datavalue = []  
    34pwd = "G:\\d"                          
    35for fl in get_allxls(pwd):
    36    fh = open_xlsx(fl)     
    37    x = get_sheet_num(fh)  
    38    for shnum in range(x):
    39        print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")
    40        rvalue = get_file_content(fl,shnum)   
    41
    42# 定义最终合并后生成的新文件
    43endfile = "G:\\d\\concat.xlsx"
    44wb1=xlsxwriter.Workbook(endfile)
    45# 创建一个sheet工作对象
    46ws=wb1.add_worksheet()
    47for a in range(len(rvalue)):
    48    for b in range(len(rvalue[a])):
    49        c=rvalue[a][b]
    50        ws.write(a,b,c)
    51wb1.close()
    52print("文件合并完成")
    

    【将上述代码封装后如下】

     1import xlrd
     2import xlsxwriter
     3import os
     4
     5class Xlrd():
     6    def __init__(self,pwd):
     7        self.datavalue = [] 
     8        self.pwd = pwd 
     9
    10    # 打开一个Excel文件,创建一个工作簿对象;
    11    def open_xlsx(self,fl):
    12        fh=xlrd.open_workbook(fl)
    13        return fh
    14
    15    # 获取sheet表的个数;
    16    def get_sheet_num(self,fh):
    17        x = len(fh.sheets())
    18        return x
    19
    20    # 读取不同工作簿中每一个sheet中的内容,并返回每行内容组成的列表;
    21    def get_file_content(self,file,shnum):
    22        fh = self.open_xlsx(file)
    23        table=fh.sheets()[shnum]
    24        num=table.nrows
    25        for row in range(num):
    26            rdata=table.row_values(row)
    27            # 因为每一个sheet表都有一个表头;
    28            # 这里的判断语句,把这个表头去除掉;
    29            # 然后在最后写入数据的,添加上一个表头,即可;
    30            if rdata == ['姓名','性别','年龄','家庭住址']:
    31                pass
    32            else:
    33                self.datavalue.append(rdata)
    34        return self.datavalue
    35
    36    # 获取xlsx文件的全路径;
    37    def get_allxls(self):
    38        allxls = []
    39        for path,dirs,files in os.walk(self.pwd):
    40            for file in files:
    41                allxls.append(os.path.join(path,file))
    42        return allxls
    43
    44    # 返回不同工作簿中,所有的sheet表的内容列表;
    45    def return_rvalue(self):
    46        for fl in self.get_allxls():
    47            fh = self.open_xlsx(fl)     
    48            x = self.get_sheet_num(fh)  
    49            for shnum in range(x):
    50                print("正在读取文件:"+str(fl)+"的第"+str(shnum)+"个sheet表的内容...")
    51                rvalue = self.get_file_content(fl,shnum)  
    52        return rvalue
    53
    54class Xlsxwriter():
    55    def __init__(self,endfile,rvalue):
    56        self.endfile = endfile
    57        self.rvalue = rvalue
    58
    59    def save_data(self):
    60        wb1 = xlsxwriter.Workbook(endfile)
    61        # 创建一个sheet工作对象;
    62        ws = wb1.add_worksheet("一年级(7)班")
    63        # 给文件添加表头;
    64        ws = wb1.add_worksheet("2018年销售量")
    65        headings = ['姓名','性别','年龄','家庭住址'] 
    66        for a in range(len(self.rvalue)):
    67            for b in range(len(self.rvalue[a])):
    68                c = self.rvalue[a][b]
    69                # 因为给文件添加了表头,因此,数据从下一行开始写入;
    70                ws.write(a+1,b,c)
    71        wb1.close()
    72        print("文件合并完成")   
    73
    74pwd = "G:\\d"
    75xl = Xlrd(pwd)
    76rvalue = xl.return_rvalue()
    77endfile = "G:\\d\\concat.xlsx"
    78write = Xlsxwriter(endfile,rvalue)
    79write.save_data();
    

    结果如下:

    640?wx_fmt=png

    四、一个工作簿多sheet表合并。

    1、将一个Excel表中的多个sheet表合并,并保存到同一个excel。

    640?wx_fmt=png
     
     1import xlrd
     2import pandas as pd
     3from pandas import DataFrame
     4from openpyxl import load_workbook
     5
     6excel_name = r"D:\pp.xlsx"
     7wb = xlrd.open_workbook(excel_name)
     8sheets = wb.sheet_names()
     9
    10alldata = DataFrame()
    11for i in range(len(sheets)):
    12    df = pd.read_excel(excel_name, sheet_name=i, index=False, encoding='utf8')
    13    alldata = alldata.append(df)       
    14
    15writer = pd.ExcelWriter(r"C:\Users\Administrator\Desktop\score.xlsx",engine='openpyxl')
    16book = load_workbook(writer.path)
    17writer.book = book  
    18# 必须要有上面这两行,假如没有这两行,则会删去其余的sheet表,只保留最终合并的sheet表
    19
    20alldata.to_excel(excel_writer=writer,sheet_name="ALLDATA")
    21writer.save()
    22writer.close()
    

    结果如下:

    640?wx_fmt=png

    五、一表拆分(按照表中某一列进行拆分)

    1、将一个Excel表,按某一列拆分成多张表。

    640?wx_fmt=png
     
     1import pandas as pd
     2import xlsxwriter
     3data=pd.read_excel(r"C:\Users\Administrator\Desktop\chaifen.xlsx",encoding='gbk')
     4
     5area_list=list(set(data['店铺']))
     6
     7writer=pd.ExcelWriter(r"C:\Users\Administrator\Desktop\拆好的表1.xlsx",engine='xlsxwriter')
     8data.to_excel(writer,sheet_name="总表",index=False)
     9
    10for j in area_list:
    11    df=data[data['店铺']==j]
    12    df.to_excel(writer,sheet_name=j,index=False)
    13
    14writer.save()  #一定要加上这句代码,“拆好的表”才会显示出来
    

    结果如下:

    640?wx_fmt=png

    今天的推荐不知道大家喜欢吗?如果你喜欢,请在文章底部留言和点赞,以表示对我的支持,你们的留言和点赞是我持续更新的动力哦,感谢大家!

    1、点个赞,让更多的人看到这篇文章,顺便激励下我,嘻嘻。

    2、关注我的原创微信公众号「杰哥的IT之旅」,专注于IT技术干货文章,以及不定期的分享学习资料,实用工具,面试经验等,当然了还有内推机会哦,期待你的关注!

    展开全文
  • 本项目基于SSM框架,简单封装了Excel批量导入导出功能,不用建数据库一键导入导出Excel,不过这样只适用于对导入的Excel进行转换,通过模板导出Excel并且能实现导入多个sheet。上一篇介绍了建表导入导出Excel...

    本项目基于SSM框架,简单封装了Excel批量导入导出功能,不用建数据库表一键导入导出Excel,不过这样只适用于对导入的Excel表进行转换,通过模板导出Excel并且能实现导入多个sheet表。上一篇介绍了建表导入导出Excel(点击跳转
    一、下载poi jar包:
        点这里下载:poi 3.8/3.9/3.10三个版本下载
                             poi 3.17最新版本下载
    二、基本操作步骤:   
    首先,理解一下一个Excel的文件的组织形式,一个Excel文件对应于一个workbook(HSSFWorkbook),一个workbook可以有多个sheet(页/表)(HSSFSheet)组成,一个sheet是由多个row(行)(HSSFRow)组成,一个row是由多个cell(单元格)(HSSFCell)组成。
    1、用HSSFWorkbook打开或者创建“Excel文件对象”
    2、用HSSFWorkbook对象返回或者创建Sheet对象
    3、用Sheet对象返回行对象,用行对象得到Cell对象
    4、对Cell对象读写。

    然后需要先新建一个Excel文件,格式样式表头标题编辑好,放入到项目中,下面是我的路径。

    WEB-INF/jsp/purchasing/orderExcel/Excel.xls

    三、控制层Controller按照模板导出Excel

    解决:MultipartFile文件或者图片上传一直为null问题

        /**
         * 导出销售订单数据
         * @param myFile
         * @param respon
         * @return
         * @throws IOException
         */
        @RequestMapping(value = "export", method=RequestMethod.POST)
        public ModelAndView exportFile(@RequestParam(value="file",required=false)MultipartFile myFile,HttpServletResponse response,HttpServletRequest request)throws IOException {
        	ModelAndView mv = this.getModelAndView();
        	try {
        		ImportExcelUtil util = new ImportExcelUtil();
        		InputStream input = null;
        		List<List<Object>> lists = null;
        		if (myFile.isEmpty()) {
        			logBefore(logger, "导入文件为空,请先添加Excel文件!");
        		} else {
        			String fileName = myFile.getOriginalFilename();
        			input = myFile.getInputStream();
        			//实现多sheet页批量导入Excel读取数据存入lists
        			lists = util.getBankListByExcel(input, fileName);
        			input.close();
        			//引入导出Excel路径
        			File fi = new File(request.getSession().getServletContext().getRealPath("/") + "WEB-INF/jsp/purchasing/orderExcel/Excel.xls");
        			POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(fi));
        			//读取excel模板
        			HSSFWorkbook wb = new HSSFWorkbook(fs);
        			//读取了模板内所有sheet内容
        			HSSFSheet sheet = wb.getSheetAt(0);
        			//如果这行没有了,整个公式都不会有自动计算的效果的
        			sheet.setForceFormulaRecalculation(true);
        			// 循环将excel中的数据存入库
        			for (int i = 1; i < lists.size(); i++) {
        				List<Object> list = lists.get(i);
        				HSSFRow dataRow = sheet.createRow((int) i + 1);  
        				dataRow.createCell(0).setCellValue(util.getFormat(String.valueOf(list.get(0))));//单据日期
        				dataRow.createCell(1).setCellValue(util.getFormat(String.valueOf(list.get(1))));//单据编号(内部单号)
        				dataRow.createCell(2).setCellValue(util.getFormat(String.valueOf(list.get(19))));//往来单位编码(客户编码)(结算客户编码)
        				dataRow.createCell(3).setCellValue("");//客户
        				dataRow.createCell(4).setCellValue(util.getFormat(String.valueOf(list.get(19))));//结算客户编码
        				dataRow.createCell(5).setCellValue("");//结算客户
        				dataRow.createCell(6).setCellValue(util.getFormat(String.valueOf(list.get(21))));//部门编码
        				dataRow.createCell(7).setCellValue("");//部门
        				dataRow.createCell(8).setCellValue(util.getFormat(String.valueOf(list.get(17))));//业务员编码
        				dataRow.createCell(9).setCellValue(util.getFormat(String.valueOf(list.get(18))));//业务员
        				dataRow.createCell(10).setCellValue(util.getFormat(String.valueOf(list.get(12))));//币种代码
        				dataRow.createCell(11).setCellValue("");//币种
        				dataRow.createCell(12).setCellValue(util.getFormat(String.valueOf(list.get(22))));//汇率
        				dataRow.createCell(13).setCellValue("");//运输方式
        				dataRow.createCell(14).setCellValue("");//送货地址
        				dataRow.createCell(15).setCellValue("");//联系人
        				dataRow.createCell(16).setCellValue("");//联系电话
        				dataRow.createCell(17).setCellValue("");//客户手机号
        				dataRow.createCell(18).setCellValue("");//合同号
        				dataRow.createCell(19).setCellValue("其它");//收款方式
        				dataRow.createCell(20).setCellValue("");//外部单据号
        				dataRow.createCell(21).setCellValue("");//按仓库拆单出库
        				dataRow.createCell(22).setCellValue("");//国际单号
        				dataRow.createCell(23).setCellValue(util.getFormat(String.valueOf(list.get(4))));//内部单号
        				dataRow.createCell(24).setCellValue(util.getFormat(String.valueOf(list.get(6))));//备注
        				dataRow.createCell(25).setCellValue(util.getFormat(String.valueOf(list.get(23))));//仓库编码
        				dataRow.createCell(26).setCellValue("");//仓库
        				dataRow.createCell(27).setCellValue("");//项目编码
        				dataRow.createCell(28).setCellValue("");//项目
        				dataRow.createCell(29).setCellValue(util.getFormat(String.valueOf(list.get(8))));//存货编码
        				dataRow.createCell(30).setCellValue("");//存货名称
        				dataRow.createCell(31).setCellValue("个");//销售单位
        				dataRow.createCell(32).setCellValue(util.getFormat(String.valueOf(list.get(9))));//数量
        				dataRow.createCell(33).setCellValue("");//报价
        				dataRow.createCell(34).setCellValue("");//折扣%
        				dataRow.createCell(35).setCellValue("0");//税率%
        				dataRow.createCell(36).setCellValue(util.getFormat(String.valueOf(list.get(10))));//含税单价
        				dataRow.createCell(37).setCellValue(util.getFormat(String.valueOf(list.get(11))));//含税金额
        				dataRow.createCell(38).setCellValue(util.getFormat(String.valueOf(list.get(13))));//国家
        				dataRow.createCell(39).setCellValue(util.getFormat(String.valueOf(list.get(15))));//货代?国际
        				dataRow.createCell(40).setCellValue(util.getFormat(String.valueOf(list.get(5))));//客户单号
        				dataRow.createCell(41).setCellValue("");//预计交货日期
        				dataRow.createCell(42).setCellValue("");//赠品
        				dataRow.createCell(43).setCellValue("");//备注
        			}
        			
        			// 设置Excel文件名,并以中文进行编码
        			String codedFileName = new String("销售订单".getBytes("gbk"), "iso-8859-1");
        			response.setHeader("Content-Disposition", "attachment;filename=" + codedFileName + DateUtil.sdfDaym() +".xlsx");
        			// 响应类型,编码
        			response.setContentType("application/octet-stream;charset=UTF-8");
        			// 形成输出流
        			OutputStream osOut = response.getOutputStream();
        			// 将指定的字节写入此输出流
        			wb.write(osOut);
        			// 刷新此输出流并强制将所有缓冲的输出字节被写出
        			osOut.flush();
        			// 关闭流
        			osOut.close();
        		}
        	} catch (Exception e) {
        		e.printStackTrace();
        		System.out.println("异常信息: " + e.getMessage() );
        		mv.addObject("msg","error");
        		mv.setViewName("purchasing/orderExcel/orderExcelList");
        		return mv;
        	}
        	mv.addObject("msg","success");
        	return mv;
        }

    四、封装Excel工具类ImportExcelUtil实现导入多个sheet表

    导入多个sheet表-->如果就一个sheet那么就读取所有行,如果有多个sheet就在第二页开始跳过标题行只读取数据,不然会出现标题重复。

    package com.fh.util;
    import java.io.InputStream;
    import java.text.DecimalFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFDataFormat;
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellStyle;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.ss.usermodel.Sheet;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    public class ImportExcelUtil {
    	
    	private final static String Excel_2003 = ".xls"; //2003 版本的excel
    	private final static String Excel_2007 = ".xlsx"; //2007 版本的excel
    	public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{
    		List<List<Object>> list = null;
    		//创建Excel工作簿
    		Workbook work = this.getWorkbook(in, fileName);
    		if(work == null) {
    			throw new Exception("创建Excel工作簿为空!");
    		}
    		Sheet sheet = null;
    		Row row = null;
    		Cell cell = null;
    		list = new ArrayList<List<Object>>();
    		//遍历Excel中的所有sheet
    		for(int i = 0; i<work.getNumberOfSheets(); i++) {
    			//如果Excel就一页一个sheet则i=0
    			if(i==0){
    				sheet = work.getSheetAt(i);
    				if(sheet == null) {continue;}
    				//遍历当前sheet中的所有行
    				//int totalRow = sheet.getPhysicalNumberOfRows();//如果excel有格式,这种方式取值不准确
    				int totalRow = sheet.getPhysicalNumberOfRows();
    				for(int j = sheet.getFirstRowNum(); j<totalRow; j++) {
    					row = sheet.getRow(j);
    					if(!isRowEmpty(row)) {
    						//if(row != null && !"".equals(row)) {
    						//获取第一个单元格的数据是否存在
    						Cell fristCell=row.getCell(0);
    						if(fristCell!=null){
    							//遍历所有的列
    							List<Object> li = new ArrayList<Object>();
    							//int totalColum = row.getLastCellNum();
    							for(int y = row.getFirstCellNum(); y<row.getLastCellNum(); y++) {
    								cell = row.getCell(y);
    								if(cell == null){
    									String callCal ="";
    									li.add(callCal);
    								}else{
    									String callCal = this.getCellValue(cell)+"";
    									li.add(callCal);
    								}
    							}
    							list.add(li);
    						}
    
    					}else if(isRowEmpty(row)){
    						continue;
    					}
    					
    				}
    			}else{
    				//如果是第二页sheet要从第二行遍历数据去掉标题行即i>0
    				sheet = work.getSheetAt(i);
    				if(sheet == null) {continue;}
    				//遍历当前sheet中的所有行
    				int totalRow = sheet.getPhysicalNumberOfRows();
    				//j从第二行读取数据即j=1跳过标题行
    				for(int j = 1; j<totalRow; j++) {
    					row = sheet.getRow(j);
    					if(!isRowEmpty(row)) {
    						//if(row != null && !"".equals(row)) {
    						//获取第一个单元格的数据是否存在
    						Cell fristCell=row.getCell(0);
    						if(fristCell!=null){
    							//遍历所有的列
    							List<Object> li = new ArrayList<Object>();
    							//int totalColum = row.getLastCellNum();
    							for(int y = row.getFirstCellNum(); y<row.getLastCellNum(); y++) {
    								cell = row.getCell(y);
    								if(cell == null){
    									String callCal ="";
    									li.add(callCal);
    								}else{
    									String callCal = this.getCellValue(cell)+"";
    									li.add(callCal);
    								}
    							}
    							list.add(li);
    						}
    
    					}else if(isRowEmpty(row)){
    						continue;
    					}
    					
    				}
    			}
    			
    		}
    		in.close();
    		return list;
    	}
    	/**
    	 * 判断行是否为空
    	 * @param row
    	 * @return
    	 */
    	public static boolean isRowEmpty(Row row) {
    		   for (int c = row.getFirstCellNum(); c < row.getLastCellNum(); c++) {
    		       Cell cell = row.getCell(c);
    		       if (cell != null && cell.getCellType() != Cell.CELL_TYPE_BLANK)
    		           return false;
    		   }
    		   return true;
    		}
    	/**
    	 * 描述:根据文件后缀,自动适应上传文件的版本
    	 * @param inStr,fileName
    	 * @return
    	 * @throws Exception
    	 * */
    	public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception {
    		Workbook work = null;
    		String fileType = fileName.substring(fileName.lastIndexOf("."));
    		if(Excel_2003.equals(fileType)){
    			work=new HSSFWorkbook(inStr);//2003 版本的excel
    		}else if(Excel_2007.equals(fileType)) {
    			work=new XSSFWorkbook(inStr);//2007 版本的excel
    		}else {
    			throw new Exception("解析文件格式有误!");
    		}
    		return work;
    	}
    	
    	/**
    	 * 描述:对表格中数值进行格式化
    	 * @param cell
    	 * @return
    	 * */
    	public Object getCellValue(Cell cell) {
    		String result = new String();  
            switch (cell.getCellType()) {  
            case HSSFCell.CELL_TYPE_FORMULA:  //Excel公式
                try {  
                	result = String.valueOf(cell.getNumericCellValue());  
                } catch (IllegalStateException e) {  
                	result = String.valueOf(cell.getRichStringCellValue());
                }  
                break;
            case HSSFCell.CELL_TYPE_NUMERIC:// 数字类型  
                if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式  
                    SimpleDateFormat sdf;  
                    if (cell.getCellStyle().getDataFormat() == HSSFDataFormat  
                            .getBuiltinFormat("h:mm")) {  
                        sdf = new SimpleDateFormat("HH:mm");  
                    } else {// 日期  
                        sdf = new SimpleDateFormat("yyyy-MM-dd");  
                    }  
                    Date date = cell.getDateCellValue();  
                    result = sdf.format(date);  
                } else if (cell.getCellStyle().getDataFormat() == 58) {  
                	//如果导出格式是yyyy/MM/dd那么如下
                	//SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); 
                	//如果导出格式是例如:9月10日那么如下
                    SimpleDateFormat sdf = new SimpleDateFormat("M月d日");  
                    double value = cell.getNumericCellValue();  
                    Date date = org.apache.poi.ss.usermodel.DateUtil  
                            .getJavaDate(value);  
                    result = sdf.format(date);  
                } else {  
                    double value = cell.getNumericCellValue();  
                    CellStyle style = cell.getCellStyle();  
                    DecimalFormat format = new DecimalFormat();  
                    String temp = style.getDataFormatString();  
                    // 单元格设置成常规  
                    if (temp.equals("General")) {  
                        format.applyPattern("#.##");  
                    }  
                    result = format.format(value);  
                }  
                break;  
            case HSSFCell.CELL_TYPE_STRING:// String类型  
                result = cell.getRichStringCellValue().toString();  
                break;  
            case HSSFCell.CELL_TYPE_BLANK:  
                result = "";  
            default:  
                result = "";  
                break;  
            }  
            return result;  
    	}
    	
    	public String getFormat(String str) {
    		if(str.equals("null")) {
    			str="";
    			return str;
    		}else{
    			return str;
    		}	
    	}
    	public Integer getFormats(Integer str) {
    		if(str==null) {
    			str=0;
    			return str;
    		}else{
    			return str;
    		}	
    	}
    	
    	/**
    	 * 获取字符串中的数字订单号、数字金额等,如从"USD 374.69"中获取到374.69、从“交易单号:66666666666”获取到66666666666
    	 * @param receiptAmountString
    	 * @return
    	 */
    	public static String getFormatNumber(String str){
    		str = str.trim();
    		 Pattern p = Pattern.compile("[0-9]");
    		 int indexNum = 0;
    		 int lenght = str.length();
    		 String num = "";
    		 for(int i=0;i<lenght;i++){
    			num += str.charAt(i);
    		 	Matcher m = p.matcher(num);
    		 	if(m.find()){
    		 		indexNum = i;
    		 		break;
    		 	}
    		  }
    		 String formatNumber = str.substring(indexNum,lenght);
    		 return formatNumber;
    	}
    }
    

    五、jsp页面

    <form action="orderExcel/export.do" name="Form" id="Form" method="post" enctype="multipart/form-data">
    		<table id="table_report" class="table table-striped table-bordered table-hover">
    			<tr>
    				<td style="width:70px;text-align: right;padding-top: 13px;">选择Excel:</td>
    				<td><input id="uploadFile" name="file" type="file" style="width:330px" onchange="fileType(this)"/><br/><br/>  
    				</td>
    			</tr>
    			 <tr>
    				<td style="text-align: center;" colspan="10">
    					<input id="btnImportSubmit" class="btn btn-small btn-success" type="submit" value="Excel转换"/>
    				</td>
    			</tr>
    		</table>
    </form>
    <script type="text/javascript">
    		var msg = '${msg}';
    		if(msg == 'error'){
    			alert("导出文件失败!请检查Excel文件!")
    		}
    		$(top.hangge());
    		//检索
    		function search(){
    			top.jzts();
    			$("#Form").submit();
    		}
    		//过滤类型
    		function fileType(obj){
    			var fileType=obj.value.substr(obj.value.lastIndexOf(".")).toLowerCase();//获得文件后缀名
    		    if(fileType != '.xls' && fileType != '.xlsx'){
    		    	$("#uploadFile").tips({
    					side:3,
    		            msg:'请选择正确的Excel文件',
    		            bg:'#AE81FF',
    		            time:3
    		        });
    		    	$("#uploadFile").val('');
    		    }
    		}
    </script>

     

     

     

     

     

    展开全文
  • 在我们用R语言分析数据的过程中,有时候跑代码会遇到需要来回读取多个文件的情况,麻烦又费时;或者有时候想要从有着大量数据的Excel表格中筛选出自己需要的一些数据分别做表格或者分别读入R.本小辣鸡新手最近在分析...
  • Sub 工作表拆分2() '通过筛选方法完成需求,速度快,但当有合并单元格时就不能用。读者可以根据实际情况选用 Dim SplitCol As String, ColNum As Integer, HeadRows As Byte, arr, lastrow, i, ShtIndex, only As ...
  • Java POI合并多个word文件

    万次阅读 热门讨论 2018-09-17 14:29:04
    对于多个docx文件,可以使用POI合并生成一个组合的docx文件,这个方法分享给大家。不过对于docx文件中存在有图片的文档,此种方法没有做处理,需要的朋友可以自己扩展一下。 import java.io.FileNotFoundException...
  • 使用antd中的select下拉框,遇到小问题,后台管理系统中,使用下拉框,一般不会是简单的就直接使用select中的value值,而是会使用id或者value中文对应的keyword,并且这在option中的value值也是可能重复的1....
  • 多个dataframe需要写入同一个excel时,每次使用df.to_excel(文件名)的形式去写,系统都会重新创建一个新的文件。也就意味着前面的文件会被覆盖掉,你得到的只能是最后一个df写入的结果文件 通过创建一个ExcelWriter...
  • js根据json对象数组动态生成表格

    千次阅读 2017-10-15 15:06:45
    需求:(1).ajax取得json对象数组后,根据数组内所有json对象的所有key和value生成相应的表格标题和表格数据; (2).不显示json数据的某些key; (3).对某些key进行先后排序显示。 2.js代码: (function(){$("#...
  • 对项目中的所有参数去除前后空格过滤,统一处理参数!可以基于此过滤器实现过滤跨站脚本攻击,参数的增加,修改!敏感词汇过滤。实现原理为重写HttpServletRequestWrapper,获取参数的方法。include和 Forwarded ...
  • 1. 表格生成后第一列是复选框,效果: 表格是直接循环展示的后台返回数据,代码写法: 2. 得复选框中已选中的值: // 得复选框已选中的值 var boxs = $('input[name="userId"]'); var userIds = []; for...
  • 对象的引用和清除_Java语言程

    千次阅读 2021-03-17 15:54:13
    对象的引用和清除_Java语言程4.3.3 对象的引用和清除在创建了类的对象后,就可以使用对象。即对象使用的原则是“先创建后使用”。使用对象的方法是:通过运算符“.”访问对象的各个成员变量和成员方法,进行各种...
  • 来源:Excel在工程中的应用一、问题描述今天在群里看到一网友提问: 怎样去掉表格中的打勾的小方格? 二、问题分析这问题大家会发现,这些小框框是不是不能选中?为什么呢?因为他们是控件,也就是我们编程时...
  • 1个订单号对应多个商品1:功能:点击订单信息显示订单详情(订单下可能出现一个或者多个商品)2:效果截图(黑色为订单数据,红色为商品数据)3:用table表格显示出来,此时要考虑商品实付款的信息是订单的信息。...
  • 参数传递 书上把参数传递放到了select元素那一块讲,不过这部分实际上增删查改都一样用。 新增一用来测试的: 使用Map传递
  • JVM中对象的回收过程

    千次阅读 2019-02-28 00:14:47
      当我们的程序开启运行之后就,就会在我们的java堆中不断的产生新的对象,而这是需要占用我们的存储空间的,因为创建一新的对象需要分配对应的内存空间,显然我的内存空间是固定有限的,所以我们需要对没有用的...
  • 面向对象原则:高内聚、低耦合。聚合、少继承

    万次阅读 多人点赞 2017-12-18 19:28:38
    面向对象原则:高内聚、低耦合。聚合、少继承要点概括【高内聚、低耦合】 内聚:每模块尽可能独立完成自己的功能,不依赖于模块外部的代码。 耦合:模块与模块之间接口的复杂程度,模块之间联系越复杂耦合度越...
  • 电脑Word文档中两个表格如何合并

    千次阅读 2021-07-28 05:07:22
    电脑Word文档中两个表格如何合并腾讯视频/爱奇艺/优酷/外卖 充值4折起Word文档是我们经常在工作和学习中使用的软件,我们有的时候也会在Word文档中绘制表格。接下来小编就教大家怎么在Word文档中将两个表格拼接。...
  • 最近遇到很要在两个表之间同步数据的情况,比如在sheet1 为基础 中有非常的字段 姓名 学号 班级 专业 性别 年龄 籍贯 张A 001 一班 计算机 男 15 北京 王B 002 一班 物理 男 30 上海 张C 003 一...
  • >@select-all="onSelectAll" 全选是触发的事件@selection-change="selectItem" 单个去勾选时触发的事件@row-click="onSelectOp" ...引用信息会根据父组件的 $refs 对象进行注册。如果在普通的DOM元素上使用,引...
  • c++类和类的封装,对象线程封装

    千次阅读 2017-07-30 09:18:02
    c++类和类的封装,对象线程封装C++面向对象编程介绍 面向对象编程(Object Oriented Programming),简称OOP。...对象实体,使程序更模块化,更易读易写,提升了代码重用到一更高的层次; 对象提供了对数据操作的直接
  • 解决方法如下: 文件——选项,打开“Excel选项”对话框, 选择“信任中心”的“信任中心设置”打开“信任中心”对话框, ...去掉“文档特定设置”的“保存时从文件属性中删除个人信息”的对勾。
  • js 如何删除数组中指定对象及其值

    千次阅读 2019-10-07 18:51:53
    for (var i = 0; i < stationall.length; i++) { delete stationall[i]._index; delete stationall[i]._rowKey; } ...遍历一下,这数组。然后_index和_row对象。这种情况就...
  • Java POI 导出excel ,表头excel

    千次阅读 2018-07-11 17:41:30
    本人也因需要使用,所以这两天就研究了一下,并做记录。 这里先简单介绍一下导出excel的几种方法,如我标题所说,poi导出excel,所以这里不会讲和poi无关的其他API的实现,并且我也不会。综合这两天看的文章,...
  • 时间 天气状态 最高温 最低温 的相关信息,并记录保存在本地csv表格文件中。 以杭州为例:http://www.weather.com.cn/weather/101210101.shtml 爬取的页面截图: html获取信息截图: 二、原理:  1
  • 首先说明,接下来 这部分内容,跟面向对象没什么关系,只是描述出我们接下来 "需要做什么 ".  大家都知道电梯是怎么回事了,所以获取需求的过程我就不啰嗦了,直接把最后结果描述出来.(对于计算机专业学生或软件工程...
  • 去除Word中插入的Visio对象的空白

    千次阅读 2018-06-14 23:05:54
    办法:在Word中双击插入的Visio对象,即在Word中进入Visio的编辑模式点击Visio对象,确定该对象被选中按住ctrl键,把鼠标移到Visio页面边缘,会看到有图标显示边缘可以移动移动四边缘到合适的位置,然后点击word...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 148,766
精华内容 59,506
关键字:

去除多个表格的对象