精华内容
下载资源
问答
  • 根据表格内容删除对应的主目录内及子目录内对应的文件。(文件名称可以自定义)
  • Python办公自动化——提取pdf文件中表格并到Excel

    千次阅读 多人点赞 2021-06-29 08:52:13
    Python办公自动化——提取pdf文件中表格并到Excel 需求描述 现有一 pdf 文件内容如下,文件中内容主要是表格形式的获奖名单,共158页。现要读取这些表格信息并保存到 excel 文件中。 import pdfplumber ...

    Python办公自动化——提取pdf文件中表格合并到Excel

    需求描述

    现有一 pdf 文件内容如下,文件中内容主要是表格形式的获奖名单,共158页。现要读取这些表格信息并保存到 excel 文件中。

    在这里插入图片描述
    import pdfplumber
    import pandas as pd
    
    def read_pdf_2020(read_path, save_path):
        pdf_2020 = pdfplumber.open(read_path)
        result_df = pd.DataFrame()
        for page in pdf_2020.pages:
            table = page.extract_table()
            df_detail = pd.DataFrame(table[1:], columns=table[0])
            # 合并每页的数据集
            result_df = pd.concat([df_detail, result_df], ignore_index=True)
        # 删除值全部是 NaN 的列
        result_df.dropna(axis=1, how='all', inplace=True)
        # 重置列名
        result_df.columns = ['奖项', '作品编号', '作品名称', '参赛学校', '作者', '指导老师']
        result_df.to_excel(excel_writer=save_path, index=False, encoding='utf-8')
        
    read_path = '2020年中国大学生计算机设计大赛参赛作品获奖名单.pdf'
    save_path = '2020年中国大学生计算机设计大赛参赛作品获奖名单.xlsx'
    df_2020 = read_pdf_2020(read_path, save_path)
    

    运行效果:

    在这里插入图片描述


    这就是本文所有的内容了,如果感觉还不错的话。❤ 点个赞再走吧!!!❤

    在这里插入图片描述
    后续会继续分享《Python自动化办公》系列文章,如果感兴趣的话可以点个关注不迷路哦~。

    展开全文
  • Upload 上传组件的使用使用el-upload组件上传文件具体参数说明,如何实现上传、下载、删除等功能获取文件列表进行file-list格式匹配代码文件展示列表自定义为表格展示使用的具体参数说明文件大小展示问题(KB/MB)...

    官方文档链接

    官方文档 https://element.eleme.cn/#/zh-CN/component/upload

    使用el-upload组件上传文件

    在这里插入图片描述

    具体参数说明,如何实现上传、下载、删除等功能

    • action:文件上传地址,我的项目里已经封装好了请求。使用的时候需要依据项目填写。

    • show-file-list: 是否显示已上传文件列表。

    • headers:设置上传的请求头部。我的项目需要传token。

    • on-preview:点击文件列表中已上传的文件时的钩子。
      可以在这个这个回调方法里写下载功能部分代码,实现点击文件下载功能。

    • on-remove:文件列表移除文件时的钩子。
      在文件列表回显时,使用数组fileData记录id列,执行删除回调时,匹配id,因为删除回调方法返回的file中不记录id,只记录url,可通过url相同返回id,再调用删除接口。

    • on-successfunction(response, file, fileList) 文件上传成功时的钩子。
      如果不设置auto-upload:false ,则选取文件后立即进行上传,成功回调后使用返回的参数调用接口,完成文件上传。

    获取文件列表进行file-list格式匹配

    • file-list :上传的文件列表, 例如: [{name: ‘food.jpg’, url: ‘https://xxx.cdn.com/xxx.jpg’}]
    • 列表回显时,需要将返回列表对应参数赋值给file-list对应的数组fileData 。

    代码

    <template>
      <basic-container>
        <el-form :model="dataForm" ref="dataForm" label-width="140px">
          <el-form-item>
            <el-upload class="upload-demo" 
              ref="upload" 
              :headers="headers" 
              action="/admin/sys-file/upload"
              :on-preview="handlePreview" 
              :on-remove="handleRemove" 
              :on-success="handleAvatarSuccess" 
              :file-list="fileData">
              <el-button slot="trigger" size="small" type="primary">上传文件</el-button>
            </el-upload>
          </el-form-item>
        </el-form>
      </basic-container>
    </template>
    
    <script>
      import {
        getObj,
        addObj,
        putObj,
        fetchList,
        getnoticeId,
        delObj
      } from '@/api/policy/noticeattachment'
      import store from '@/store'
      import {mapState} from 'vuex'
      export default {
        data() {
          return {
            dataForm: {
              id: 0,
              noticeId: '',
              attachName: '',
              attachUrl: '',
            },
            dataList: [],
            fileData: [],
            headers: {
              'Authorization': 'Bearer ' + store.getters.access_token,
            },
          }
        },
        methods: {
          init(id) {
            // console.log(id)
            this.dataForm.noticeId = id
            //数组每次需要清空
            this.fileData.splice(0, this.fileData.length);
            this.$nextTick(() => {
              this.$refs['dataForm'].resetFields();
              if (this.dataForm.noticeId) {
                getnoticeId(this.dataForm.noticeId).then(response => {
                  this.dataList = response.data.data;
                  this.dataList.forEach(list => {
                    this.fileData.push({
                      name: list.attachName,
                      url: list.attachUrl,
                      id: list.id //删除时使用
                    })
                  })
                });
              }
            });
          },
          //移除回调
          handleRemove(file, fileList) {
            let resultArr = this.fileData.filter((item) => {
              return item.url === file.url
            });
            // console.log(resultArr[0])
            this.dataForm.id = resultArr[0].id
            this.$nextTick(() => {
              this.deleteHandle(this.dataForm.id)
            })
          },
          //点击文件列表中已上传的文件时的钩子
          handlePreview(file) {
            console.log(file);
            var a = document.createElement('a');
            var event = new MouseEvent('click');
            a.download = file.name;
            a.href = file.url;
            a.dispatchEvent(event);
          },
          //成功回调
          handleAvatarSuccess(res, file, fileList) {
            this.dataForm.attachName = file.name
            this.dataForm.attachUrl = res.data.url
            this.dataFormSubmit()
          },
          // 删除
          deleteHandle(id) {
            delObj(id).then(data => {
              this.$message.success('删除成功')
            })
          },
          // 表单提交
          dataFormSubmit() {
            this.$refs['dataForm'].validate((valid) => {
              if (valid) {
                if (this.dataForm.id) {
                  putObj(this.dataForm).then(data => {
                    this.$message.success('修改成功')
                  });
                } else {
                  addObj(this.dataForm).then(data => {
                    this.$message.success('添加成功')
                  })
                }
              }
            })
          }
        }
      }
    </script>
    
    

    文件展示列表自定义为表格展示

    在这里插入图片描述

    使用的具体参数说明

    • show-file-list: 是否显示已上传文件列表。
      展示自定义表格样式需要设置show-file-list=“false”
    • on-successfunction(response, file, fileList) 文件上传成功时的钩子。
      如果不设置auto-upload:false ,则选取文件后立即进行上传,成功回调后使用返回的参数调用接口,完成文件上传。

    文件大小展示问题(KB/MB)

    • 上传文件时size默认传file返回的size大小(默认为1字节),在表格展示时进行判断,如果大于1MB展示单位为MB,小于1MB展示单位KB。
    • MB:size / 1024 / 1024
    • KB:size / 1024
      (既然提到字节,可能有的人不熟悉字节,这里顺便记录一下字节转换关系)
      字节也叫Byte,是计算机数据的基本存储单位。
      8bit(位)=1Byte(字节)
      1024Byte(字节)=1KB
      1024KB=1MB
      1024MB=1GB
      1024GB=1TB
      其中:K是千 M是兆 G是吉咖 T是太拉。

    文件下载

    • 点击下载按钮,实现下载此文件。使用a标签,传入对应文件name和url。具体代码下面记录。

    代码

    <template>
      <basic-container>
            <el-upload class="upload-demo"
              ref="upload"
              :headers="headers"
              action="/admin/sys-file/upload"
              :on-success="handleAvatarSuccess"
              :show-file-list="false">
              <el-button slot="trigger" size="small" type="primary">上传文件</el-button>
            </el-upload>
            <el-table class="down" :data="dataList" border stripe style="width: 100%;margin-top: 20px;">
                <el-table-column prop="attachName" label="文件名称"></el-table-column>
                <el-table-column prop="attachSize" label="文件大小">
                  <template slot-scope="scope">
                      <span v-if="scope.row.attachSize / 1024 / 1024 < 1">{{(scope.row.attachSize / 1024).toFixed(2) + 'KB'}}</span>
                      <span v-else>{{(scope.row.attachSize / 1024 / 1024).toFixed(2) + 'MB'}}</span>
                  </template>
                </el-table-column>
                <el-table-column prop="createTime" label="上传时间"></el-table-column>
                <el-table-column width="150px" label="操作">
                    <template slot-scope="scope">
                        <el-button size="small" type="text">
                            <a @click="downloadFile(scope.row.attachName,scope.row.attachUrl)">下载</a>
                        </el-button>
                        <el-button size="small" type="text" @click="deleteHandle(scope.row.id)">删除</el-button>
                    </template>
                </el-table-column>
            </el-table>
        </el-form>
      </basic-container>
    </template>
    
    <script>
      import {
        getObj,
        addObj,
        putObj,
        fetchList,
        getnoticeId,
        delObj
      } from '@/api/policy/noticeattachment'
      import store from '@/store'
      import {mapState} from 'vuex'
      export default {
        data() {
          return {
            dataForm: {
              id: 0,
              noticeId: '',
              attachName: '',
              attachUrl: '',
              attachSize: '',
            },
            dataList: [],
            headers: {
              'Authorization': 'Bearer ' + store.getters.access_token,
            },
          }
        },
        methods: {
          init(id) {
            this.dataForm.noticeId = id
            this.$nextTick(() => {
              if (this.dataForm.noticeId) {
                this.getDataList()
              }
            });
          },
          //获取附件列表
          getDataList(){
            getnoticeId(this.dataForm.noticeId).then(response => {
              this.dataList = response.data.data;
            });
          },
          //下载按钮回调
          downloadFile(name,url){
            var a = document.createElement('a');
            var event = new MouseEvent('click');
            a.download = name;
            a.href = url;
            a.dispatchEvent(event);
          },
          //成功回调
          handleAvatarSuccess(res, file, fileList) {
            this.dataForm.attachName = file.name
            this.dataForm.attachUrl = res.data.url
            this.dataForm.attachSize = file.size
            this.dataFormSubmit()
          },
          // 删除
          deleteHandle(id) {
            this.$confirm('是否确认删除该附件', '提示', {
              confirmButtonText: '确定',
              cancelButtonText: '取消',
              type: 'warning'
            }).then(function () {
              return delObj(id)
            }).then(data => {
              this.$message.success('删除成功')
              this.getDataList()
            })
          },
          // 表单提交
          dataFormSubmit() {
            addObj(this.dataForm).then(data => {
              this.$message.success('添加成功')
              this.getDataList()
            })
          }
        }
      }
    </script>
    <style lang="scss" scoped="scoped">
      .down >>> a {
        color: #409EFF;
      }
    </style>
    
    

    上传文件大小与文件类型校验

    1. 可以在beforeUpload方法中进行过滤。
    2. 使用accept参数

    我自己的项目里暂时没有限制,后续有需求的话会进行更新。这里不做过多概述。
    下面po官网代码:

    <el-upload
      class="avatar-uploader"
      action="https://jsonplaceholder.typicode.com/posts/"
      :show-file-list="false"
      :on-success="handleAvatarSuccess"
      :before-upload="beforeAvatarUpload">
      <img v-if="imageUrl" :src="imageUrl" class="avatar">
      <i v-else class="el-icon-plus avatar-uploader-icon"></i>
    </el-upload>
    
    <script>
      export default {
        data() {
          return {
            imageUrl: ''
          };
        },
        methods: {
          handleAvatarSuccess(res, file) {
            this.imageUrl = URL.createObjectURL(file.raw);
          },
          beforeAvatarUpload(file) {
            const isJPG = file.type === 'image/jpeg';
            const isLt2M = file.size / 1024 / 1024 < 2;
    
            if (!isJPG) {
              this.$message.error('上传头像图片只能是 JPG 格式!');
            }
            if (!isLt2M) {
              this.$message.error('上传头像图片大小不能超过 2MB!');
            }
            return isJPG && isLt2M;
          }
        }
      }
    </script>
    

    差不多使用到的就这些啦,如果有新需求会继续记录。

    展开全文
  • jQuery网页表格导出Excel文件是一款一键导出Excel文件表格代码。
  • CSV文件表格对比软件

    热门讨论 2009-12-12 23:48:50
    对CSV文件中表格内容进行对比,通过设置主键列,寻找出增加的行,删除的行,内容修改的行这些信息。 使用前,最好用Excel对要对比的两个CSV文件保存一下,保证格式的一致性。
  • HTML页面表格导出为EXCEL文件

    万次阅读 2018-10-12 11:59:31
    1、js文件准备 jquery.table2excel.js 下载地址 https://github.com/rainabba/jquery-table2excel CSDN站内也多有该插件的下载提供 2、页面引入js插件 &lt;script type="text/javascript" src="...

    1、js文件准备 jquery.table2excel.js

    下载地址 https://github.com/rainabba/jquery-table2excel
    CSDN站内也多有该插件的下载提供

    2、页面中引入js插件

    <script type="text/javascript" src="${pageContext.request.contextPath}/js/jquery.table2excel.js"></script>
    

    3、定义table的css属性 生成导出按钮

    <table class="table2excel">
    	<tr>
    		<th>生产厂家</th>
    		<th>产品名称</th>
    		<th>...</th>
    		<th> class="noExl">操作</th>
    	</tr>	
    	<tr>
    		<td>厂家1<td>
    		<td>产品1<td>
    		<td>...<td>
    		<td class="noExl"><button>删除</button><button>修改</button><td>
    	</tr>
    		<tr>
    		<td>厂家2<td>
    		<td>产品2<td>
    		<td>...<td>
    		<td class="noExl"><button>删除</button><button>修改</button><td>
    	</tr>
    </table>
    <table>
    	<tr>
    		<td>
    			<input type="button" value="导出到excel中" class="btn btn-primary" onclick="table2Excel('出库信息明细.xls')"/>
    		</td>
    	</tr>
    </table>
    

    4、创建table2Excel(filename)方法

    //filename 导出的excel文件名
    //方法可带filename参数,亦可不带参数直接定义
    function table2Excel(filename){
    	$(".table2excel").table2excel({
    		exclude: ".noExl",//class="noExl"的列不导出
    		name: "Excel Document Name",
    		filename: filename,//文件名称
    		fileext: ".xls",//文件后缀名
    		exclude_img: true,//导出图片
    		exclude_links: true,//导出超链接
    		exclude_inputs: true//导出输入框内容
    	});
    }
    

    5、需要注意的点

    我们的客户多为医院,浏览器基本上以XP和win7系统的ie为主,所以测试环境实在IE浏览器上进行的,最开始总是导出一个没有后缀的文件。由于有关于fileext的后缀名设置,所以也没有意识到是这方面的问题。直到一次测试中直接由导出按钮传递文件名称的参数时带上了.xls的后缀才成功导出正确的excel文件,在此标注,仅供参考

    展开全文
  • 这个表格有漂亮的样式,可以隔行换色,单元格可以高亮显示,可以添加一行表格,删除本行,还可以排序,表格中有下拉框、checkbox等空间,挺好的功能。 但是要在IE8上运行,其他浏览器是不支持的,文件为.html格式,...
  • ExcelRebuild表格恢复软件,默认下对于一个盘符的扫描是以扫描该盘的剩余空间表格数据,因为最常见的数据丢失情况就是删除或者格式化一个硬盘或者U盘,如果您要修改扫描范围,可以勾上软件上的“显示高级设置”...
  • 1、把WORD表格转换成EXCEL,只转换表格忽略其中的文字部分 2、把WORD表格删除,只留下文字部分,不要担心删除文件,有备份
  • ElementUI如何将表格中指定行的数据导出excel文件-附件资源
  • 利用python-docx批量处理Word文件——表格

    万次阅读 多人点赞 2018-10-28 21:28:28
    Word和Excel大概是我们最常碰到的两种文件了,我前面写过pandas的基本操作,利用它可以轻松完成Excel文件的批量处理,那么对于word文件的处理...这个文件中有多个这样表格,我们要将它们处理成一个简单表——属性...

    Word和Excel大概是我们最常碰到的两种文件了,我前面写过pandas的基本操作,利用它可以轻松完成Excel文件的批量处理,那么对于word文件的处理是否也有同样简单的方式,答案是肯定的,这涉及到python的另一个库docx,这篇文章的主要内容是:
    如何批量处理word中的表格
    我随便找了一个Word文件,它的部分内容如下:
    在这里插入图片描述
    这个文件中有多个这样表格,我们要将它们处理成一个简单表——属性一行,值 一行
    下面正式开始,docx之外的内容我将不做详细说明,有问题请留言。


    1.安装docx:

    pip install python-docx

    2.导入docx库

    from docx import Document
    import pandas as pd
    

    3.读Word文件

    doc=Document('2007年三江源生态监测森林数据集.docx')
    

    ps:docx不支持doc格式的word文件。

    4.读表格

    tb=doc.tables
    

    5.读行

    rows=tb[0].rows
    

    6.读列

    cols=rows[0].cells
    

    7.单元格

    cell=cols[0]
    text=cell.text
    

    有了上面的基础知识,读取word中的表格应该没什么问题了,下面是是完整代码:

    doc=Document('2007年三江源生态监测森林数据集.docx')
    index,key,value=[],[],[]
    table_index=0
    for tb in doc.tables:
     table_index+=1
     row_index=0
     for row in tb.rows:
         row_index+=1
         for cell in row.cells:
             text=""
             for p in cell.paragraphs:##如果cell中有多段,即有回车符
                 text+=p.text
             if row_index%2==0:
                 value.append(text)#偶数行为值
                 index.append(table_index)#这行也可以放在else中
             else:
                 key.append(text)#奇数行为属性
    

    现在word中所有表格的内容已经读出来了,不过是在两个列表中,将它们重新构造成一个表格。

    8.重建表格

    df=pd.DataFrame({'table_index':index,'key':key,'value':value})
    

    在这里插入图片描述
    但是这个表格并不是我们想要的结果,我们想要的是key为表头,value为值,table_index为索引,所以我们还需要进一步的操作。

    8.pviot

    #删除重复行,否则会报错:Index contains duplicate entries, cannot reshape  
    df=df.drop_duplicates(['table_index','key'])
    df1=df.pivot(index='table_index',columns='key',values='value')
    #下面两行用于去除列名和索引名,可有可无,加上只因为我有强迫症,为了美观,感兴趣的朋友可以对比加上这现行前后的差异
    df1.columns=list(df1.columns)
    df1.index=list(df1.index)
    

    最终得到的表格是这样的:
    在这里插入图片描述

    9.如何把表格写入word文件

    上面的表格内容太多,我们取一部分写入word中

    from docx.enum.table import WD_TABLE_ALIGNMENT
    from docx.shared import Cm
    df2=df1.iloc[:10,:6]
    d=Document()
    tb=d.add_table(rows=len(df2.index),cols=len(df2.columns))
    tb.add_row()
    for i in range(len(df2.columns)):
        tb.cell(0,i).text=df2.columns[i]#添加表头
    for row in range(1,len(df2.index)+1):
        for col in range(len(df2.columns)):
            tb.cell(row,col).width=1
            tb.cell(row,col).text=df2.iloc[row,col]
            tb.cell(row,col).width=Cm(6)
            tb.cell(row,col).ipynb
    tb.style='Medium Grid 1 Accent 1'
    tb.autofit=True
    d.save('tb.docx')
    

    最后生成的word表格是这样的:
    在这里插入图片描述
    关于表格的样式控制将在另一篇博客中展开讨论:利用python批量处理Word文件——表格(二)样式控制
    关于word表格的处理就到这里了,现实中我们要处理的文件内容千变万化,不过只要熟练这些基础操作,就可以以不变应万变,后面我会继续写word中其它内容的处理,感兴趣的朋友可以多多关注。

    展开全文
  • Jquery动态删除添加表格中的内容

    千次阅读 2016-04-07 19:11:11
    在做项目时候,需要动态的对表格中的数据进行删除和添加,这里说一下我的思路。 1、通过获取Servlet传过来的List集合,将数据显示在Table表格中 序号 <th
  • linux删除文件中含有某字符的行

    千次阅读 2018-11-13 02:21:28
    linux删除文件中含有某字符的行
  • 本人前端小白,因项目需要自学vue以及elementUI,遇到实现将表格中指定行的数据导出为excel文件中的需求,特此记录实现过程和心得,便于日后方便查阅。 安装依赖 npm install --save xlsx file-saver npm install -D...
  • QT 程序 删除文本文件中某一行

    热门讨论 2012-06-05 17:50:56
    用qt 实现删除文本文件中一行,deleteonelineinfile(int nNumLine, QString & filename);输入文件名和删除的行号可以删除。行号是0到行数减一。
  • 通过本文及配套示例源码你可以更加灵活的控制Excel表格文件,其中包括创建新Excel文件、写入表格数据、读取表格数据(包括对原建Excel文件自已手工添加的行、列数据的准确读取),删除已有Excel表格,对表格中指定行、...
  • KiField可以从原理图或库中提取所有组件字段,并将它们放入电子表格中以进行批量编辑,然后您可以将电子表格中的编辑值重新插入到原理图或库中。 KiField通常在三步过程中使用: 首先使用KiField从原理图或库中...
  • 用过宏后会自动打开一个PERSONAL.XLSB的表格,删除方法很简单,进入目录:“C:\Users\tiger\AppData\Roaming\Microsoft\Excel\XLSTART”,,删除文件即可
  • Jquery实现表格中的查看删除修改

    千次阅读 多人点赞 2014-11-28 23:55:56
    首先我们在学习js的时候就有接触到表格中的一些操作... 现在就用学到的Jquery来做一个表格中的查看删除修改感受一下Jquery的强大。  第一步:我们编写html页   查看修改删除 姓名 年龄 职位 工资
  • 这周四开会,发现部门的需求文档里,都是没用的双删除线,完全没有用途,几百页的文档里充斥了这样的垃圾,让我看着很不爽,所以就写了VBA程序来把这些内容删除了,试了试还不错。代码如下: Function IsReadOnly...
  • 通过本文及配套示例源码你可以更加灵活的控制Excel表格文件,其中包括创建新Excel文件、写入表格数据、读取表格数据(包括对原建Excel文件自已手工添加的行、列数据的准确读取),删除已有Excel表格,对表格中指定行、...
  • Python Pandas操作Excel表格文件:创建新表格,追加数据

    万次阅读 多人点赞 2019-07-29 14:49:45
    python操作excel表格文件的增删读写,一般需要用到的第三方库有xlwt,xlrd。xlrd负责读取excel,xlwt负责写入excel文件。这种操作方法比较繁琐,效率还不错,通俗易懂。 那么有没有一种更简便,操作更简单,效率还...
  • markdown编辑复杂表格

    万次阅读 2018-07-13 16:32:12
    markdown编辑复杂表格 使用markdown自带语法 markdown自带了基本的表格编辑语法: 如: | name | age | gender | money | |-------|:---:|-----------|-------:| | rhio | 384 | robot | $3,000 | | ...
  • 安装的是Python32bit的工具;把excel表格格式转换成*.csv格式文件;若想删除生成的文件,只需把最后一句放开即可。注:并没有把格式也转换过去。
  • 为什么excel文件中的表不能删除

    万次阅读 2017-10-15 14:40:46
    如果excel表格里的内容无法删除的话,这个是excel表格设置了“保护工作表或者“保护”工作簿”了,只有取消“保护工作表或者“保护”工作簿”才可以删除工作里的内容了。 ...
  • 使用AngularJS修改、删除表格数据

    万次阅读 2016-11-07 20:17:28
    实现angularJS实现了表格内容的删除和修改的功能,相比直接使用原生js,angularJS显得简单方便很多,减去了DOM操作直接修改数据,将数据绑定使得页面直接根据数据内容来显示,代码更加明了快捷.这也是angularJS的...
  • 在开发,有时需要以表格树的形式加载数据,但是数据量特别大时,可能只是先加载一层,如果有子节点就在名称前显示一个“+”号或其它图标,然后点击“+”再展示子节点。 本示例前提表示你已经搭建好angular运行的...
  • Django删除数据库表格后如何重建

    千次阅读 2018-01-09 21:44:17
    为了解决群友的问题,我亲自删了下我自己数据库的一个表,然后敲了一系列的dos命令,发现都不够完美,最终我发现了在数据库里...然后我们还需要删除migrations里的那个迁移文件, 然后直接,python manage.py mak

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 214,249
精华内容 85,699
关键字:

如何删除文件中的表格