精华内容
下载资源
问答
  • 文档的标题是当天的日期。比如2019/01/01 于是我就想一次打出来很多。比如打完半年的。 这样要求,每一页的日期标题会自己递增。 (总不能一个一个手动改吧(ᵒ̤̑ ₀̑ ᵒ̤̑) OMG!) 觉得是可以实现的,...
  • 手机拍摄很多照片,导入到电脑后,都一个目录;无法按拍摄日期分类存放;此小工具能按照拍摄日期和文件类型分类存放;压缩包有代码以及编译过的可执行程序;WINDOWS 直接点击运行即可;代码用VISUAL BASIC写的,简单易懂...
  • Bootstrap Table API 中文版(完整翻译文档

    万次阅读 多人点赞 2017-09-11 20:20:27
    >Bootstrap table API 中文文档(完整翻译文档) *$('#table').bootstrapTable({}); *看网上有中文版的,但有些就是字面直接译过来了,而且有的就没有翻译,那就打算自己再翻译一遍,每一条会尽 *最大可能结合尽可能...

    Bootstrap table API 中文文档(完整翻译文档)
    *$(’#table’).bootstrapTable({});
    *看网上有中文版的,但有些就是字面直接译过来了,而且有的就没有翻译,那就打算自己再翻译一遍,每一条会尽
    *最大可能结合尽可能多资料翻译,如果发现译的内容比英文多,是添加了更详细的说明,表的名称,属性,类型,
    *默认值不翻译,例如:“class”、"id"等不翻译。
    *有错请提出,会及时改正,谢谢。
    如果想转请评论留个言并注明原博 @Sclifftop https://blog.csdn.net/S_clifftop/article/details/77937356

    给我评论点赞,听到没有,臭弟弟


    • “名称”可以写在$('#table').bootstrapTable({});的大括号中,可以定义一些想要的值,如:
    $("#realTime_Table").bootstrapTable({
      	  search: true,
          pagination: false,
          pageSize: 15,
          pageList: [5, 10, 15, 20],
          showColumns: true,
          showRefresh: false,
          showToggle: true,
          locale: "zh-CN",
          striped: true
    });  
    
    • “属性”放在声明表内,如:
    <!--例子应该很好看懂Table options和Column options 所放的位置不同,随便写的,主要为了懂得如何用--!>
    
     <table id="realTime_Table" data-click-to-select="true" class="table table-bordered" data-page-size="20">
          <thead>
              <tr >
                  <th data-sortable="true" data-field="realTimeDate">日期</th>
                  <th data-sortable="true" data-field="newPlayerNum">新增用户</th>
                  <th data-sortable="true" data-field="activePlayerNum">活跃用户</th>
              </tr>
          </thead>
          <tbody>
          </tbody>
    </table>
    
    • 如果名称和属性功能类似,则任意一个地方就够了,不用重复定义,有的属性写在js里比名称写在声明表中更为简单,or vice verse(有的属性必须要写,对应的名称只是表示是否启用那个属性)


    表的各项(Table options )

    定义在 jQuery.fn.bootstrapTable.defaults 文件内

    名称属性类型默认值作用描述
    -data-toggleStringtable只要引入 jquery、bootstrap 、bootstrap-table的包,不用在js里面定义就可以使用
    默认有写data-toggle="table",data-toggle应该知道吧,常用的有"tooltip、popover等等",这边就不说了
    classesdata-classesStringtable table-hover表的class属性,如果没有自己定义,则默认有边框,并且当鼠标悬浮在那一行,背景会变为浅灰色.
    sortClassdata-sort-classStringundefined声明表格td的class名,代表此列元素的class名将被排序
    heightdata-heightNumberundefined表格的高度
    undefinedTextdata-undefined-textString - 当不写任何内容默认显示'-'
    stripeddata-stripedBooleanfalse默认false,当设为true,则每行表格的背景会显示灰白相间
    sortNamedata-sort-nameStringundefined定义哪一列的值会被排序,写data-field的自定义名,没定义默认都不排列,同下面的sortOrder结合使用,没写的话列默认递增(asc)
    sortOrderdata-sort-orderStringasc同上面的结合使用,默认递增(asc),也可设为递减(desc)
    sortStabledata-sort-stableBooleanfalse(别看错了,是sortStable,sortable在下面)默认false,设为true,则和sort部分一样,区别是:在排序过程中,如果存在相等的元素,则原来的顺序不会改变。原文还有一句:(如果你把此属性设为了true)我们将为此行添加'_position'属性
    iconsPrefixdata-icons-prefixStringglyphicon定义字体库 ('Glyphicon' or 'fa' for FontAwesome),使用"fa"时需引用 FontAwesome,并且配合 icons 属性实现效果 Glyphicon 集成于Bootstrap可免费使用
    iconSizedata-icon-sizeStringundefined定义的图标大小:
          - undefined =>默认表示默认的按钮尺寸(btn)
          - xs   =>超小按钮的尺寸(btn-xs)
          - sm  =>小按钮的尺寸(btn-sm)
          - lg    =>大按钮的尺寸(btn-lg)
    buttonsClassdata-buttons-classStringdefault按钮的类,默认为default。
          - 可选的有:primary、danger、warning等等
          - 写了之后会自动转换为btn-primary(蓝色)、btn-danger(红色)、btn-warning(黄色)等格式,所以前面不要再加"btn-",默认为btn-default(白色)
          - 参考菜鸟教程:Bootstrap 按钮
    iconsdata-iconsObject{ paginationSwitchDown: 'glyphicon-collapse-down icon-chevron-down',
    paginationSwitchUp: 'glyphicon-collapse-up icon-chevron-up',
    refresh: 'glyphicon-refresh icon-refresh',
    toggle: 'glyphicon-list-alt icon-list-alt',
    columns: 'glyphicon-th icon-th',
    detailOpen: 'glyphicon-plus icon-plus',
    detailClose: 'glyphicon-minus icon-minus'
    }
    定义在工具栏、分页、详细视图中使用的图标
          - 没办法解释,请参考菜鸟教程的图标:Bootstrap 字体图标
    columns-Array[]默认空数组,在JS里面定义,field即data-field,title就是每列表头名等等。
          - 请参考:查Bootstrap-table的Usage
    data-Array[]被加载的数据。
          - 也就是从服务器获取的数据,通过"."运算符获取,例如"data.date/data.anything",后面是服务器发来的字段名
    dataFielddata-data-fieldStringrows      - 名称写自己定义的每列的字段名,也就是key,通过key才能给某行的某列赋value。
          - 原文:获取每行数据json内的key
          - 例如:{"name":"zz","age":20},name和age就是key,如果这是从服务端请求的json,那可能和每列定义的字段不同,但都是唯一的
    ajaxdata-ajaxFunctionundefined      - ajax方法,和jQuery的ajax方法类似
          - 参考 BootstrapTable实现定时刷新数据,只是参考,因为那是jQuery的ajax方法
    methoddata-methodStringget向服务器请求远程数据的方式,默认为'get',可选'post'
    urldata-urlStringundefined向服务器请求的url。
          - 例如:server + "get_app_player"和server + 'get_channel_list',两者都是向server(server是自己定义的,例如"http://kanshakan.nichousha.com/")请求数据,只是接口不同,一个是请求该游戏玩家信息,一个是请求渠道信息
    下面看看原文:
          - 向远程站点请求数据的URL
          - 请记住,如果服务端分页选项使用了自定义的,那么请求的服务器响应格式是不同的,参考下面两个数据格式:
          Without server-side pagination(没有启用服务端分页 - data1.json)
          With server-side pagination(启用服务端分页 - data2.json)
    cachedata-cacheBoolean true 默认缓存ajax请求,设为false则禁用缓存
    contentTypedata-content-typeString application/json请求数据的contentType(内容类型),用于定义文件的类型,决定接收方以什么形式读取这个文件。
          - 默认application/json,用来告诉接收端从服务器发来的消息是序列化后的json字符串
    dataTypedata-data-typeStringjson期望从服务器获取的数据的类型,默认为json格式字符串
    ajaxOptionsdata-ajax-optionsObject{}向服务器请求ajax时的附加项,默认无附加
          - 参考 jQuery.ajax()
    queryParamsdata-query-paramsFunction
    function(params){
    return params;}
    当请求数据时,你可以通过修改queryParams向服务器发送其余的参数。
          - queryParamsType="limit",它的参数包括:limit,offset,search,sort,order Else
          - params包括:pageSize,pageNumber,searchText,sortName,sortOrder
          - 当return false,请求则终止
    queryParamsTypedata-query-params-typeStringlimit默认"limit",设置该属性用来发送符合RESTful格式的参数
    responseHandlerdata-response-handlerFunction
    function(res){
    return res;}
    在加载服务器发送来的数据之前,处理数据的格式,参数res表示the response data(获取的数据)
    paginationdata-paginationBooleanfalse默认为false,表格的底部工具栏不会显示分页条(pagination toolbar),可以设为true来显示
    paginationLoopdata-pagination-loopBooleantrue默认true,分页条无限循环
    onlyInfoPaginationdata-only-info-paginationBooleanfalse前提:pagination设为true,启用了分页功能。
          - 默认false,设为true显示总记录数
    sidePaginationdata-side-paginationStringclient设置在哪进行分页,默认"client",可选"server",如果设置 "server",则必须设置url或者重写ajax方法
          - 请记住,如果服务端分页选项使用了自定义的,那么请求的服务器响应格式是不同的,参考下面两个数据格式:
          Without server-side pagination(没有启用服务端分页)
          With server-side pagination(启用服务端分页)
    pageNumberdata-page-numberNumber1前提:pagination设为true,启用了分页功能。
          - 默认第1页,用于设置初始的页数
    pageSizedata-page-sizeNumber10前提:pagination设为true,启用了分页功能。
          - 默认每页显示10条记录,用于设置每页初始显示的条数
    pageListdata-page-listArray[10, 25, 50, 100]前提:pagination设为true,启用了分页功能。
          - 默认为[10, 25, 50, 100],即可以选择"每页显示10/25/50/100条记录",用于设置选择每页显示的条数
    selectItemNamedata-select-item-nameStringbtSelectItemradio(单选按钮)或checkbox(复选框)的字段名
    smartDisplaydata-smart-displayBooleantrue默认为true,会 机智地(<_<) 根据情况显示分页(pagination)或卡片视图(card view)
    escapedata-escapeBooleanfalse 跳过插入HTML中的字符串,替换掉特殊字符(后面符号没有逗号):&,<,>,",`,'
    searchdata-searchBooleanfalse默认false不显示表格右上方搜索框 ,可设为true,在搜索框内只要输入内容即开始搜索
    searchOnEnterKeydata-search-on-enter-keyBooleanfalse默认false不启用,设为true启用,比功能是与上面相比,在搜索框内输入内容并且按下回车键才开始搜索
    strictSearchdata-strict-searchBooleanfalse设为true,开启精确搜索
    searchTextdata-search-textString""前提:search设为true,启用了搜索功能。
          - 搜索框初始显示的内容,默认空字符串
    searchTimeOutdata-search-time-outNumber500前提:search设为true,启用了搜索功能。
          - 设置搜索文件的超时时间(原文:Set timeout for search fire,不知道是写错了还是我知识面太窄,"search fire"是什么意思,官方API错了?给我整蒙逼了)
    trimOnSearchdata-trim-on-searchBooleantrue默认true,自动忽略空格
    showHeaderdata-show-headerBooleantrue默认为true显示表头,设为false隐藏
    showFooterdata-show-footerBooleanfalse默认为false隐藏表尾,设为true显示
    showColumnsdata-show-columnsBooleanfalse默认为false隐藏某列下拉菜单,设为true显示
    showRefreshdata-show-refreshBooleanfalse默认为false隐藏刷新按钮,设为true显示
    showToggledata-show-toggleBooleanfalse默认为false隐藏视图切换按钮,设为true显示

    新版的CSDN有bug,所以其余的Table options另写一个表格 [ Bootstrap Table API 中文版(完整翻译文档) ]

    名称属性类型默认值作用描述
    showPaginationSwitchdata-show-pagination-switchBooleanfalse默认为false隐藏每页数据条数选择,设为true显示
    minimumCountColumnsdata-minimum-count-columnsNumber1每列的下拉菜单最小数
    idFielddata-id-fieldStringundefined表明哪个是字段是标识字段
    uniqueIddata-unique-idStringundefined表明每行唯 一的标识符
    cardViewdata-card-viewBooleanfalse默认false,设为true显示card view(卡片视图)
    detailViewdata-detail-viewBooleanfalse默认false,设为true显示detail view(细节视图)
    detailFormatterdata-detail-formatterFunctionfunction(index, row, element){
    return '';}
    前提:detailView设为true,启用了显示detail view。
          - 用于格式化细节视图
          - 返回一个字符串,通过第三个参数element直接添加到细节视图的cell(某一格)中,其中,element为目标cell的jQuery element
    searchAligndata-search-alignStringright搜索框的位置,默认right(最右),可选left
    buttonsAligndata-buttons-alignStringright工具栏按钮的位置,默认right(最右),可选left
    toolbarAligndata-toolbar-alignStringleft自定义工具栏的位置,默认right(最右),可选left
    paginationVAligndata-pagination-v-alignStringbottom分页条垂直方向的位置,默认bottom(底部),可选top、both(顶部和底部均有分页条)
    paginationHAligndata-pagination-h-alignStringright分页条水平方向的位置,默认right(最右),可选left
    paginationDetailHAligndata-pagination-detail-h-alignStringleft如果解译的话太长,举个例子,paginationDetail就是“显示第 1 到第 8 条记录,总共 15 条记录 每页显示 8 条记录”,默认left(最左),可选right
    paginationPreTextdata-pagination-pre-textString还是举例子,如果你内容太多,底部最右边会显示:"‹ 1 2 3 4 5 ›"来选择页数,默认就是最左边那个符号,下同
    paginationNextTextdata-pagination-next-textString参考上面一条
    clickToSelectdata-click-to-selectBooleanfalse默认false不响应,设为true则当点击此行的某处时,会自动选中此行的checkbox(复选框)或radiobox(单选按钮)
    singleSelectdata-single-selectBooleanfalse默认false,设为true则允许复选框仅选择一行
    toolbardata-toolbarString | NodeundefinedjQuery的选择器,例如:#toolbar,.toolbar,或者是DOM 结点
    checkboxHeaderdata-checkbox-headerBooleantrue如果你有声明复选框,默认显示表头行的全选复选框,设为false隐藏(就是表格第一行的不显示,从第二行往后都显示)
    maintainSelecteddata-maintain-selectedBooleanfalse设为true则保持被选的那一行的状态
    sortabledata-sortableBooleantrue默认true,设为false禁用所有的行排列(也就是每列表头不会显示排序的按钮,这个需要在th声明data-sortable="true",写在js中只是启不启用)
    slientSortdata-silent-sortBooleantrue前提:sidePagination设为server(服务端)
          - 默认true,设为false则静默排序数据
    rowStyledata-row-styleFunction{}改变某行的格式,需要两个参数:
          - row:此行的数据
          - index:此行的索引
    支持classes和css,用法如下: function rowStyle(row, index){
        return { classes: 'text-nowrap another-class',
    css: {"color": "blue", "font-size": "50px"}
    }; }
    rowAttributesdata-row-attributesFunction{}改变某行的属性,需要两个参数:
          - row:此行的数据
          - index:此行的索引
    支持所有自定义的属性。
    customSearchdata-custom-searchFunction$.noop自定义搜索功能(用来代替自带的搜索功能),需要一个参数:
          - text:想要搜索的内容
    用法如下:
    function customSearch(text){
         //必须使用'this.data'对数据进行过滤(filter the data,感觉这个词也不用译),不要使用'this.options.data' }
    customSortdata-custom-sortFunction$.noop自定义排序功能(用来代替自带的排序功能),需要两个参数(可以参考前面):
          - sortName:需要排序的那列
          - sortOrder:排序方式
    用法:和上面一样,不用担心,注释也一模一样
    localedata-localeStringundefined本地化(动词)。
    本地化的文件必须被预加载,允许fallback(简单来说就是如果要使用的文件不可用,就可以用别的替代它,例如球场替补,没替补,如果有人受伤了,比赛不就废了),如果加载,将按如下顺序:
          - 首先尝试加载的是指定的"本地化"文件
          - 然后是'_'(下划线)写成'-'(破折号),并且区域代码被大写的
          - 然后是短区域代码(例如:用'fr'代替'fr-CA')
          - 最后使用的是剩下的本地化文件(当没有文件可加载则使用默认的)
    如果剩余的undefined,或者是空字符,则使用最后一次使用的那个文件(当没有本地化文件可被加载,则使用自带的'en_US')
    footerStyledata-footer-styleFunction{}改变footer格式,需要两个参数:
          - row:此行的数据
          - index:此行的索引
    支持classes和css,用法如下:
    function rowStyle(value,row, index){
        return { css: { "font-weight": "bold" } }; }

    列的各项(Column options )

    定义在 jQuery.fn.bootstrapTable.columnDefaults 文件内

    名称属性类型默认值作用描述
    radiodata-radioBooleanfalse默认false不显示radio(单选按钮),设为true则显示,radio宽度是固定的
    checkboxdata-checkboxBooleanfalse默认false不显示checkbox(复选框),设为true则显示,checkbox的每列宽度已固定
    fielddata-fieldStringundefined是每列的字段名,不是表头所显示的名字,通过这个字段名可以给其赋值,相当于key,表内唯一
    titledata-titleStringundefined这个是表头所显示的名字,不唯一,如果你喜欢,可以把所有表头都设为相同的名字
    titleTooltipdata-title-tooltipStringundefined当悬浮在某控件上,出现提示
           - 参考 Bootstrap 提示工具(Tooltip)插件
    classclass/data-classStringundefined没什么好说的,就是class
    rowspanrowspan/data-rowspanNumberundefined每格所占的行数
    colspancolspan/data-colspanNumberundefined每格所占的列数
    aligndata-alignStringundefined每格内数据的对齐方式,有:left(靠左)、right(靠右)、center(居中)
    haligndata-halignStringundefinedtable header(表头)的对齐方式,有:left(靠左)、right(靠右)、center(居中)
    faligndata-falignStringundefinedtable footer(表脚,就这样译,任性,其实随便译啦,知道就好)的对齐方式,有:left(靠左)、right(靠右)、center(居中)
    valigndata-valignStringundefined每格数据的对齐方式,有:top(靠上)、middle(居中)、bottom(靠下)
    widthdata-widthNumber(单位:px或%)undefined每列的宽度。
           - 如果没有自定义宽度,那么宽度会根据内容的宽度自适应。
           - 如果表是左适应(left responsive)或者设置的宽度小于内容的宽度,那么,宽度还是会自适应(可以在class或其他的属性中使用 min-width 或 max-width)。
           - 你也可以使用"%"作为单位,这样的话,bootstapTable将按百分比划分,如果你想使用"pixels(像素值)",你可以只写数字(只要不加"%",单位默认"px",不嫌麻烦,或者想更清晰,你也可以加上"px")
    sortabledata-sortableBooleanfalse默认false就默认显示,设为true则会被排序
    orderdata-orderStringasc默认的排序方式为"asc(升序)",也可以设为"desc(降序)"。
           - 与上面的结合使用,不然都不让排序了,你还考虑什么升降。
    visibledata-visibleBooleantrue默认为true显示该列,设为false则隐藏该列。
           - 还是很有用的,例如隐藏自定义index列,按某属性排序后会变乱,你可以读取某行的index来进行赋值
    cardVisibledata-card-visibleBooleantrue默认为true显示该列,设为false则隐藏。
    switchabledata-switchableBooleantrue默认为true显示该列,设为false则禁用列项目的选项卡。
    clickToSelectdata-click-to-selectBooleantrue默认true不响应,设为false则当点击此行的某处时,不会自动选中此行的checkbox(复选框)或radiobox(单选按钮)
    formatterdata-formatterFunctionundefined 需要此列的对象。
           某格的数据转换函数,需要三个参数:
             -value: field(字段名)
             -row:行的数据
             -index:行的(索引)index
    footerFormatterdata-footer-formatterFunctionundefined需要此列的对象。
           某格的数据转换函数,需要一个参数:
             -data: 所有行数据的数组
           函数需要返回(return)footer某格内所要显示的字符串的格式,还要包括内容
    eventsdata-eventsObjectundefined当某格使用formatter函数时,事件监听会响应,需要四个参数:
             -event:jQuery事件(参考Events)。
             - value:字段名
             - row:行数据
             - index:此行的index
    举个例子:
         <th .. data-events="operateEvent"> var operateEvents = {'click .like': function (e, value, row, index) {}};
    sorterdata-sorterFunctionundefined自定义的排序函数,实现本地排序,需要两个参数:
             - a:第一个字段名
             - b:第二个字段名
    sortNamedata-sort-nameStringundefined除了表头默认的sort-name或列的字段名,还可以使用自定义的sort-name
           对特殊情况说明:
             - 一个列显示的内容或许是"html"代码,如:<b><span style="color:red">abc</span></b>,但是被排列的是html代码中的内容(content):abc
    cellStyledata-cell-styleFunctionundefined对某格中显示样式(style)进行改变,需要三个函数:
             - value:字段名
             - row:行数据
             - index:此行的index
             - field:行的字段名
    支持classes和css,用法如下:
         function cellStyle(value, row, index, field) { return { classes: 'text-nowrap another-class', css: {"color": "blue", "font-size": "50px"} }; }
    searchable data-searchableBooleantrue默认true,表示此列数据可被查询
    searchFormatterdata-search-formatterBooleantrue默认true,可使用格式化的数据查询
    escapedata-escapeBooleanfalse 跳过插入HTML中的字符串,替换掉特殊字符(后面符号没有逗号):&,<,>,",`,'

    事件(Events)

    定义事件的格式:

    $(’#table’).bootstrapTable({
    onEventName: function (arg1, arg2, …) {
    // …
    } });

    $(’#table’).on(‘event-name.bs.table’, function (e, arg1, arg2, …) {
    // …
    });


    事件名定义在jQuery中的事件名参数作用描述
    onAllall.bs.tablename, args当所有触发器被触发时都执行此函数,就是所有的事件都会触发该事件,参数包括:
             - name:事件名
             - args:事件的数据
    onClickRowclick-row.bs.tablerow, $element, field当单击此行的任意一处,就会触发该事件,所需参数如下(只是按原文译过来的,在bootstraptable的js中不需要这些参数,因为单击该行就会获得一个row,row中包括此行所有数据,只要通过此行某列的字段名即可取出):
             - row:哪一行(从0开始)
             - $element:该行(tr)
             - field:当点击该行,你想获取此行哪一格的数据,field就是此列字段名
             - 参考:Bootstrap Table 双击或单击行获取该行内容
    onDblClickRowdbl-click-row.bs.tablerow, $element, field和上面差不多,当双击(666)此行的任意一处,就会触发该事件,所需参数如下(只是按原文译过来的,在bootstraptable的js中不需要这些参数,因为双击该行就会获得一个row,row中包括此行所有数据,只要通过此行某列的字段名即可取出):
             - row:哪一行(从0开始)
             - $element:该行(tr)
             - field:当点击该行,你想获取此行哪一格的数据,field就是此列字段名
             - 参考:Bootstrap Table 双击或单击行获取该行内容
    onClickCellclick-cell.bs.tablefield, value, row, $element当单击某一格,就会触发该事件,所需参数如下:
             - field:此格所在列的字段名
             - value:此格的数据
             - $element:此行的此列,就是此格(td)
    onDblClickCelldbl-click-cell.bs.table field, value, row, $element当双击某一格,就会触发该事件,所需参数如下:
             - field:此格所在列的字段名
             - value:此格的数据
             - $element:此行的此列,就是此格(td)
    onSortsort.bs.tablename, order当对某列进行排序时触发该事件,所需参数如下:
             - name:所排序的列的字段名
             - order:所排的顺序
    onCheckcheck.bs.tablerow, $element当选择(check)此行时触发,所需的参数如下:
             - row:所选择的行的字段名
             - $element:此行的DOM元素
    onUncheckuncheck.bs.tablerow, $element当取消选择(uncheck)此行时触发,所需的参数如下:
             - row:所取消选择的行的字段名
             - $element:此行的DOM元素
    onCheckAllcheck-all.bs.tablerows当全选行时触发,所需的参数如下:
             - rows:最近(newly)所选择的行的字段名的数组
    onUncheckAlluncheck-all.bs.tablerows当取消全选行时触发,所需的参数如下:
             - rows:之前或上次(previously)所选择的行的字段名的数组
    onCheckSome check-some.bs.tablerows当选择(check)某些行(多行,rows)时触发,所需的参数如下:
             - rows:之前或上次(previously)所选择的行的字段名的数组
    onUncheckSomeuncheck-some.bs.tablerows当取消选择(uncheck)某些行(多行,rows)时触发,所需的参数如下:
             - rows:之前或上次(previously)所选择的行的字段名的数组
    onLoadSuccess load-success.bs.tabledata当所有数据被加载时触发
    onLoadErrorload-error.bs.tablestatus, res当加载某些数据出现错误时触发
    onColumnSwitchcolumn-switch.bs.tablefield, checked当某列改变是否可见的状态时触发
    onColumnSearchcolumn-search.bs.tablefield, text当某列被查询时触发
    onPageChangepage-change.bs.tablenumber, size当改变此页所显示的数据条数或改变页码时触发
    onSearchsearch.bs.tabletext当查询此表时触发
    onToggletoggle.bs.tablecardView当改变表的视图时触发
    onPreBodypre-body.bs.tabledata当<tbody></tbody>中的内容没显示前触发
    onPostBodypost-body.bs.tabledata当<tbody></tbody>中的内容被加载完后或者在你所用的DOM中有定义则被触发
    onPostHeaderpost-header.bs.tablenone当<thead></thead>中的内容被加载完后或者在你所用的DOM中有定义则被触发
    onExpandRowexpand-row.bs.tableindex, row, $detail当查看详细视图(点击查看detail的图标)时触发
    onCollapseRowcollapse-row.bs.tableindex, row当关闭详细视图(再次点击查看detail的图标)时触发
    onRefreshOptionsrefresh-options.bs.tableoptions当刷新各项后或在初始化表(也包括销毁了再初始化)之前触发
    onResetViewreset-view.bs.table当重置(reset)表的视图时触发
    onRefresh refresh.bs.tableparams当点击刷新按钮(refresh,不是浏览器的,而是表格右上角的刷新按钮)后触发

    方法(Methods)

    定义方法响应的语法 $('#table').bootstrapTable('method', parameter);

    方法名参数描述举例
    getOptionsnone返回各项的object$table.bootstrapTable('getOptions');
          - 请查看: getOptions
    getSelectionsnone返回被选择的行,当没有行被选择,则返回空数组(但并不是undefined,也不是null,是长度为0的空数组,所以可以判断长度是否大于0来确定是否选择了行)$table.bootstrapTable('getSelections');
          - 请查看: getSelections
    getAllSelectionsnone返回所有被选的行(原文中:contain search or filter,其实就是你选择的筛选之后的数据),当没有行被选择,则返回空数组$table.bootstrapTable('getAllSelections');
          - 请查看: getAllSelections
    showAllColumnsnone显示所有的列$table.bootstrapTable('showAllColumns');
          - 就是显示所有的列,并没什么可说的
    hideAllColumnsnone隐藏所有的列$table.bootstrapTable('hideAllColumns');
          - 就是隐藏所有的列
    getDatauseCurrentPage获取被加载的表的数据,如果你设置了使用当前页的数据(useCurrentPage),则返回当前页的数据$table.bootstrapTable('getData');
          - 请查看: getData
    getRowByUniqueIdid获取你想要的某行的数据(设置某行的id)$table.bootstrapTable('getRowByUniqueId', 1);后面的1就是你要的那一行的ID
          - 请查看: getRowByUniqueId
    loaddata向表中加载数据,原来的数据将被移除$table.bootstrapTable('load', data);
          - 请查看: load

    新版的CSDN有bug,所以其余的Methods另写一个表格 [ Bootstrap Table API 中文版(完整翻译文档)]

    方法名参数描述举例
    appenddata将数据追加在最后一行后$table.bootstrapTable('append', data);data可以是数组
          - 请查看: append
    prependdata也是追加,只是在第一行之前$table.bootstrapTable('prepend', data);data可以是数组
          - 请查看: prepend
    removeparams移除一行或多行你所选的数据$table.bootstrapTable('remove', {field: 'id', values: ids});
          - id:所需移除的那一行(rows,一或多行)的字段
          - values:被移除的行的数组
          - 请查看: remove
    removeAll-移除表中所有的数据$table.bootstrapTable('removeAll');
          - 请查看: removeAll
    removeByUniqueId-移除某行数据(设置某行的id)$table.bootstrapTable('removeByUniqueId', 1);后面的1就是你想移除的那一行的ID
          - 请查看: removeByUniqueId
    insertRowparams新增一行,所需的参数如下:
          - index:你想插入到哪(只要愿意,想插哪就插哪,想插谁就插谁)
          - row:你想插入的数据
    $table.bootstrapTable('insertRow', {index: 1, row: row});
          - 请查看: insertRow
    updateRowparams更新行数据,所需的参数如下:
          - index:所要更新的行的索引(index)
          - row:你想换的新的数据
    $table.bootstrapTable('updateRow', {index: 1, row: row});
          - 请查看: updateRow
          - 请查看: Bootstrap Table实现定时刷新数据
    updateByUniqueIdparams更新某行数据,所需的参数如下:
          - id:你想更新那行的id(唯一),(只要愿意,想换哪个换哪个)
          - row:你想换的新的数据
    $table.bootstrapTable('updateByUniqueId', {id: 3, row: row});
          - 请查看: updateByUniqueId
    showRowparams显示特定行,所需的参数至少包括下面所列的一个:
          - id:所要显示的行的索引(index)
          - uniqueId:那一行的id
    $table.bootstrapTable('showRow', {index:1});
          - 请查看: showRow/hideRow
    hideRowparams隐藏特定行,所需的参数至少包括下面所列的一个:
          - id:所要隐藏的行的索引(index)
          - uniqueId:那一行的id
    $table.bootstrapTable('hideRow', {index:1});
          - 请查看: showRow/hideRow
    getRowsHiddenboolean获取隐藏的行(官方原话很多,其实总结起来就前面那一句)$table.bootstrapTable('getRowsHidden');

    新版的CSDN有bug,所以其余的Methods另写一个表格 [ Bootstrap Table API 中文版(完整翻译文档) ]

    方法名参数描述举例
    mergeCellsoptions融合~(把多格合并为一格),所需的参数如下:
          - index:所要合并的格所在行的索引(index)
          - field:所在列的字段名
          - rowspan:合并的行总数目
          - colspan:合并的列总数目
    $table.bootstrapTable('mergeCells', {index: 1, field: 'name', colspan: 2, rowspan: 3});
          - 请查看: mergeCells
    updateCellparams更新某格数据,所需的参数如下:
          - index:所要合并的格所在行的索引(index)
          - field:所在列的字段名
          - value:要换的新的数据
    你也可以设置{reinit:false}来禁用表格的再次初始化
    $table.bootstrapTable('updateCell',{index:index,field:'id',value:value});
    refreshparams刷新服务端的数据:
          - 可以设置{silent:true}来 偷偷地(<_<) 刷新
          - 设置{url:newUrl,pageNumber:pageNumber,
    pageSize:pageSize}改变请求的地址,页数,每页所显示的条数
          - 可以设置{query:{foo:'bar'}}增加特定的参数
    $table.bootstrapTable('refresh');
          - 请查看: refresh
    refreshOptionsoptions看例子吧      - 请查看: refreshOptions
    resetSearchtext重置搜索的文本(text)      - 请查看: resetSearch
    showLoadingnone显示正在加载……      - 请查看: showLoading/hideLoading
    hideLoadingnone隐藏正在加载……      - 请查看: showLoading/hideLoading
    checkAllnone选择当前页的所有行$table.bootstrapTable('checkAll');
          - 请查看: checkAll/uncheckAll
    uncheckAllnone取消选择当前页的所有行$table.bootstrapTable('uncheckAll');
          - 请查看: checkAll/uncheckAll
    checkInvertnone反向选择,不难理解吧$table.bootstrapTable('checkInvert');
    checkindex选择某一行,索引(index)从0开始$table.bootstrapTable('check', 1);
          - 请查看: check/uncheck
    uncheckindex取消选择某一行,索引(index)从0开始$table.bootstrapTable('uncheck', 1);
          - 请查看: check/uncheck
    checkByparams通过数组选择某一行,所需的参数如下:
          - field:所要选的字段名
          - values:所要选的那些值(数组)
    官方没,啊,有例纸:
    - $("#table").bootstrapTable("checkBy", { field:"field_name", values:["value1","value2","value3"]});
          - 请查看: checkBy/uncheckBy
    uncheckByparams通过数组选择某一行,所需的参数如下:
          - field:所要取消选择的字段名
          - values:所要取消选择的那些值(数组)
    $("#table").bootstrapTable("uncheckBy", { field:"field_name", values:["value1","value2","value3"]});
          - 请查看: checkBy/uncheckBy
    resetViewparams改变表格的样式,例如改变表格的高度(height) $table.bootstrapTable('resetView');
          - 请查看: resetView
    resetWidthnone自动改变表头和表脚(就译成脚,任性)的宽度来适应每列的宽度$table.bootstrapTable('resetWidth');
    destroynone销毁表格 A!T!T!A!C!K!$table.bootstrapTable('destroy');
          - 请查看: destroy
    showColumnfield显示特定的列 $table.bootstrapTable('showColumn', 'name');
          - 请查看: showColumn/hideCoulumn
    hideColumnfield隐藏特定的列 $table.bootstrapTable('hideColumn', 'name');
          - 请查看: showColumn/hideCoulumn

    新版的CSDN有bug,所以其余的Methods另写一个表格 [ Bootstrap Table API 中文版(完整翻译文档) ]

    方法名参数描述举例
    getHiddenColumns-获取所有隐藏的列$table.bootstrapTable('getHiddenColumns');
    getVisibleColumns-获取所有显示的列$table.bootstrapTable('getVisibleColumns');
    scrollTovalue滚……到哪个位置,单位是'px',如果设为'bottom',嗖,恭喜你已到表尾 $table.bootstrapTable('scrollTo', 0);
          - 请查看: scrollTo
    getScrollPositionnone获取当前所滚到的位置,单位你懂得,就是'px'$table.bootstrapTable('getScrollPosition');
    filterBynone只能在客户端(client-side,相对server-side)这边用,过滤表中的数据
    例如:
          - 可以设置{age:10}来只显示age为10的数据
          - 不仅单的,你还可以双飞,甚至多p,设置{age: 10, hairColor: ["blue", "red", "green"]} ,这样你就得到了一群10岁的,头发颜色为蓝,红,绿的……数据
    $table.bootstrapTable('filterBy', { id: [1, 2, 3] });
          - 请查看: filterBy
    selectPagepage跳转到特定的页面$table.bootstrapTable('selectPage', 1);
          - 请查看: selectPage/prevPage/nextPage
    prevPagenone跳转到上一页$table.bootstrapTable('prevPage');
          - 请查看: selectPage/prevPage/nextPage
    nextPagenone跳转到下一页$table.bootstrapTable('nextPage');
          - 请查看: selectPage/prevPage/nextPage
    togglePaginationnone词穷,请看例纸$table.bootstrapTable('togglePagination');
          - 请查看: togglePagination
    toggleViewnone改变视图$table.bootstrapTable('toggleView');
          - 请查看: toggleView
    expandRowindex可使用条件:detail view设为了true,不然无法使用视图功能,这个也没用
          - 通过参数index来展开此列的详细视图
          - 请查看: expandRow-collapseRow
    collapseRowindex可使用条件:detail view设为了true
          - 通过参数index来关闭此列的详细视图
          - 请查看: expandRow-collapseRow
    expandAllRows
    新版有更改(原来为"expandAllRow"),下同
    感谢 @zhq449681061
    is subtable可使用条件:detail view设为了true
          - 展开所有列的详细视图
    $table.bootstrapTable('expandAllRows');
          - 参考上面的实例,上面是展开(折叠)某一行的视图,这个是所有行的
    collapseAllRowsis subtable可使用条件:detail view设为了true
          - 关闭所有列的详细视图
    $table.bootstrapTable('collapseAllRows');
          - 参考上面

    本地化,切换为另一种语言(Localizations)

    默认显示英文,如果想使用中文,首先引入:

    <script src="bootstrap-table-zh-CN.js"></script>

    然后是三种声明使用的方法(个人只使用第二、三种),如下:

    • 第一种:

    $.extend($.fn.bootstrapTable.defaults, $.fn.bootstrapTable.locales['zh-CN']);

    • 第二种:

    <table data-toggle="table" data-locale="zh-CN"></table>

    • 第三种:

    $('table').bootstrapTable({locale:'zh-CN'});


    • 以下说明除了数字外均为中文默认显示,本来不用写的,只要引入就显示中文了,下面数字我就默认15,这个实际要看你设置的是多少
    名称参数默认说明
    formatLoadingMessage-'Loading, please wait…'“加载中,请等待……”
    formatRecordsPerPagepageNumber'%s records per page'“每页显示 15 条记录”
    formatShowingRowspageFrom, pageTo, totalRows'Showing %s to %s of %s rows'“显示第 1 到第 15 条记录”
    formatDetailPaginationtotalRows'Showing %s rows'“总共 15 条记录”
    formatSearch-'Search'“搜索”(占位符)
    formatNoMatches-'No matching records found'“没有找到匹配的记录”
    formatRefresh-'Refresh'“刷新”(鼠标悬浮显示的文字,下同)
    formatToggle-'Toggle'“切换”
    formatColumns-'Columns'“列”

    有错请留言,看到后会及时更改,如果像那种翻译的行写成列或漏字等低级错误,看英文名称就知道有没有错了,主要就是为了让你们知道怎么用,会持续检查哪有误、漏译,如果认为有译得不妥的地方,也可以留言一起讨论,谢谢


    自己做的微信小程序工具 —维尼聚合工具( 查地铁、线路规划、二维码生成、计算器、指南针、证件识别等等)

    维尼聚合工具


    其他相关:


    展开全文
  • SheetJS中文文档-js导出Excel脚本库

    万次阅读 2021-01-08 11:33:13
    转载自 GITHUB用户rockboom 的翻译文档 SheetJs下载: GITHUB地址 | CSDN下载地址 SheetJS js-xlsx SheetJS是用于多种电子表格格式的解析器和编写器。通过官方规范、相关文档以及测试文件实现简洁的JS方法。SheetJS...

    转载自 GITHUB用户rockboom 的翻译文档
    SheetJs下载: GITHUB地址 | CSDN下载地址

    SheetJS js-xlsx

    SheetJS是用于多种电子表格格式的解析器和编写器。通过官方规范、相关文档以及测试文件实现简洁的JS方法。SheetJS强调解析和编写的稳健,其跨格式的特点和统一的JS规范兼容,并且ES3/ES5浏览器向后兼容IE6。

    目前这个是社区版,我们也提供了性能增强的专业版,专业版提供样式和专业支持的附加功能。

    专业版

    商业支持

    介绍文档

    浏览器示例

    源码

    问题和错误报告

    常见的支持问题

    支持的电子数据表的文件格式:

    支持格式的图表 (点击查看)

    在这里插入图片描述
    在这里插入图片描述

    浏览器测试在这里插入图片描述

    目录表

    点击展示目录表

    安装

    在浏览器里使用,增加一个script标签:

    <script lang="javascript" src="dist/xlsx.full.min.js"></script>
    
    使用CDN (点击显示详情)
    CDNURL
    unpkghttps://unpkg.com/xlsx/
    jsDelivrhttps://jsdelivr.com/package/npm/xlsx
    CDNjshttp://cdnjs.com/libraries/xlsx
    packdhttps://bundle.run/xlsx@latest?name=XLSX

    unpkg提供最新的版本:

    <script src="https://unpkg.com/xlsx/dist/xlsx.full.min.js"></script>
    

    使用 npm:

    $ npm install xlsx
    

    使用 bower:

    $ bower install js-xlsx
    

    JS生态示例

    示例 目录 包括了一些简单的项目:

    框架和APIS

    打包工具

    集成平台

    可选模块

    可选特点 (点击显示详情) node版本自动要求模块提供其他的特性。某些模块的文件相当大而且仅在一些特殊的场景下才会用到,因此不应该把他们当做核心部分一起加载。在浏览器中用到这些模块时,可以用下面的方式进行加载:
    <!-- international support from js-codepage -->
    <script src="dist/cpexcel.js"></script>
    

    每一个依赖合适的版本可以放在 dist/directory 目录下。
    完整的单文件版本在 dist/xlsx.full.min.js 文件里面。
    默认情况下,Webpack和Browserify构建包含可选的模块。可以通过配置Webpack移除对 resolve.alias 的支持:

      /* uncomment the lines below to remove support */
      resolve: {
        alias: { "./dist/cpexcel.js": "" } // <-- omit international support
      }
    

    ECMAScript 5 的兼容性

    自从库使用了像 Array#forEach 这样的函数,老版本的浏览器需要shim 提供缺少的函数

    要在加载 xlsx.js 的script标签之前添加shim,才能使用它。

    <!-- add the shim first -->
    <script type="text/javascript" src="shim.min.js"></script>
    <!-- after the shim is referenced, add the library -->
    <script type="text/javascript" src="xlsx.full.min.js"></script>
    

    shim.min.js也包括了在IE6-9中用于加载和保存文件的 IE_LoadFileIE_SaveFile。对于适用于Photoshop和其它的Adobe产品的格式,xlsx.extendscript.js脚本会绑定shim。

    原理

    原理 (点击显示详情) 在SheetJS之前,处理电子表格文件的接口只能用于特定的格式。许多第三方库要么支持一种格式,要么为每一种支持的文件类型提供一个不同的类集。虽然在Excel 2007里面引入了XLSB,但只有Sheet和Excel支持这种格式。

    为了提高不可知格式的显示,js-xlsx使用了被称作[“Common Spreadsheet Format”]的纯JS的显示方法(#common-spreadsheet-format)。强调一种统一的显示方式,能够有一些特点,比如格式转换和嵌套class tap。通过提取出各种格式的复杂性,工具没有必要担心特定的文件类型。

    一个简单的的对象显示和细心的代码练习相结合,能让示例运行在较老的浏览器以及像ExtendScriptWeb Workers这样可选择的环境里执行。虽然很想使用最新的和最好的特性,不过这些特性需要最新的浏览器,用以限制兼容性。

    工具函数捕获通用的使用例子,比如生成JS对象或HTML。大多数简单例子的操作只要几行代码。大多数复杂的普遍的复杂操作应该直截了当的生成。

    在Excel 2007种,Excel添加XSLX格式作为默认的起始端。然而,有一些其他格式会更多的出现上述的属性。例如,XLSB格式XLSX格式相似,不过文件会使用一半的空间,而且也会更开的打开文件。虽然XLSX编写器可以使用,但是其他格式的编写器也可以使用,因此使用者能够充分利用每一种格式独特的特点。社区版本的主要关注点在正确的数据转换,即从任意一个兼容的数据表示中提取数据,导出适用于任意第三方接口的各种数据格式。

    解析工作簿

    对于解析,第一步是读取文件。这一步包括获取数据并且导入数据库。这里有一些常用的例子。

    nodejs读取文件 (点击显示详情) `readFile` 只能在服务器环境中使用。浏览器没有用于读取任意指定路径文件的API,因此必须使用另外的策略。 ```js if(typeof require !== 'undefined') XLSX = require('xlsx'); var workbook = XLSX.readFile('test.xlsx'); /* DO SOMETHING WITH workbook HERE */ ``` Photoshop ExtendScript读取文件 (点击显示详情)

    readFile 用Photoshop和其他的ExtendScript目标把逻辑File包起来。需要指定文件的绝对路径

    #include "xlsx.extendscript.js"
    /* Read test.xlsx from the Documents folder */
    var workbook = XLSX.readFile(Folder.myDocuments + '/' + 'test.xlsx');
    /* DO SOMETHING WITH workbook HERE */
    

    extendscript 包含了一个更复杂的例子。

    浏览器从页面读取TABLE元素 (点击显示详情) `table_to_book` 和 `table_to_sheet`工具函数获取DOM的TABLE元素,并且通过子节点进行迭代。
    var workbook = XLSX.utils.table_to_book(document.getElementById('tableau'));
    /* DO SOMETHING WITH workbook HERE */
    

    一个网页里面的多张表可以被转换成单个的工作表。

    /* create new workbook */
    var workbook = XLSX.utils.book_new();
    
    /* convert table 'table1' to worksheet named "Sheet1" */
    var ws1 = XLSX.utils.table_to_sheet(document.getElementById('table1'));
    XLSX.utils.book_append_sheet(workbook, ws1, "Sheet1");
    
    /* convert table 'table2' to worksheet named "Sheet2" */
    var ws2 = XLSX.utils.table_to_sheet(document.getElementById('table2'));
    XLSX.utils.book_append_sheet(workbook, ws2, "Sheet2");
    
    /* workbook now has 2 worksheets */
    

    另一种选择,HTML代码也可以被提取和解析。

    var htmlstr = document.getElementById('tableau').outerHTML;
    var workbook = XLSX.read(htmlstr, {type:'string'});
    
    浏览器下载文件(ajax) (点击显示详情) 注意:对于运行在老版浏览器里更完整的例子,请查看示例
    var url = "http://oss.sheetjs.com/test_files/formula_stress_test.xlsx";
    
    /* set up async GET request */
    var req = new XMLHttpRequest();
    req.open("GET", url, true);
    req.responseType = "arraybuffer";
    
    req.onload = function(e) {
      var data = new Uint8Array(req.response);
      var workbook = XLSX.read(data, {type:"array"});
    
      /* DO SOMETHING WITH workbook HERE */
    }
    
    req.send();
    
    浏览器拖拽 (点击显示详情) 拖拽使用了HTML5 的 `FileReader` API,加载数据时使用`readAsBinaryString` 或 `readAsArrayBuffer`。但并不是所有的浏览器都支持全部的 `FileReader` API,因此非常推荐动态的特性检测。
    var rABS = true; // true: readAsBinaryString ; false: readAsArrayBuffer
    function handleDrop(e) {
      e.stopPropagation(); e.preventDefault();
      var files = e.dataTransfer.files, f = files[0];
      var reader = new FileReader();
      reader.onload = function(e) {
        var data = e.target.result;
        if(!rABS) data = new Uint8Array(data);
        var workbook = XLSX.read(data, {type: rABS ? 'binary' : 'array'});
    
        /* DO SOMETHING WITH workbook HERE */
      };
      if(rABS) reader.readAsBinaryString(f); else reader.readAsArrayBuffer(f);
    }
    drop_dom_element.addEventListener('drop', handleDrop, false);
    
    浏览器通过form元素上传文件 (点击显示详情)

    来自file input元素的数据能够被和拖拽例子中相同的FileReaderAPI处理。

    var rABS = true; // true: readAsBinaryString ; false: readAsArrayBuffer
    function handleFile(e) {
      var files = e.target.files, f = files[0];
      var reader = new FileReader();
      reader.onload = function(e) {
        var data = e.target.result;
        if(!rABS) data = new Uint8Array(data);
        var workbook = XLSX.read(data, {type: rABS ? 'binary' : 'array'});
    
        /* DO SOMETHING WITH workbook HERE */
      };
      if(rABS) reader.readAsBinaryString(f); else reader.readAsArrayBuffer(f);
    }
    input_dom_element.addEventListener('change', handleFile, false);
    

    oldie示例展示了一个IE兼容性的回退方案。

    包括移动App文件处理等更多的使用例子可以在included demos中查看。

    流式读取文件

    为什么没有流式读取API? (点击显示详情)

    最常用的和最令人感兴趣的格式(XLS, XLSX/M, XLSB, ODS)最终都是ZIP或CFB文件容器。两种格式都不会放目录结构在文件开头:ZIP文件把主要的目录记录放在逻辑文件的结尾,然而CFB文件可以把存储信息放在文件的任何地方。所以,为了正确地处理这些格式,流式函数必须在开始之前缓存整个文件。这样证明了流式的期待的错误,因此我们不提供任何流式阅读API。

    当处理可读流时,最简单的方式是缓存流,并且最后再去处理整个文件。这可以通过临时文件或者是显式连接流来实现。

    显式连接流 (点击显示详情)
    var fs = require('fs');
    var XLSX = require('xlsx');
    function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{
      var buffers = [];
      stream.on('data', function(data) { buffers.push(data); });
      stream.on('end', function() {
        var buffer = Buffer.concat(buffers);
        var workbook = XLSX.read(buffer, {type:"buffer"});
    
        /* DO SOMETHING WITH workbook IN THE CALLBACK */
        cb(workbook);
      });
    }
    

    使用像concat-stream这样的模块会有更多有效的解决办法可以使用。

    首先写入文件系统 (点击显示详情)

    这个例子使用tempfile生成文件名。

    var fs = require('fs'), tempfile = require('tempfile');
    var XLSX = require('xlsx');
    function process_RS(stream/*:ReadStream*/, cb/*:(wb:Workbook)=>void*/)/*:void*/{
      var fname = tempfile('.sheetjs');
      console.log(fname);
      var ostream = fs.createWriteStream(fname);
      stream.pipe(ostream);
      ostream.on('finish', function() {
        var workbook = XLSX.readFile(fname);
        fs.unlinkSync(fname);
    
        /* DO SOMETHING WITH workbook IN THE CALLBACK */
        cb(workbook);
      });
    }
    

    使用工作簿

    完整的对象格式会在本文件的后面部分进行介绍。

    读取指定的单元格 (点击显示详情)

    这个例子提取first工作表中A1单元格的存储值:

    var first_sheet_name = workbook.SheetNames[0];
    var address_of_cell = 'A1';
    
    /* Get worksheet */
    var worksheet = workbook.Sheets[first_sheet_name];
    
    /* Find desired cell */
    var desired_cell = worksheet[address_of_cell];
    
    /* Get the value */
    var desired_value = (desired_cell ? desired_cell.v : undefined);
    
    在工作簿中增加新的工作表 (点击显示详情)

    例子中使用XLSX.utils.aoa_to_sheet生成工作表,使用XLSX.utils.book_append_sheet把表添加到工作簿中。

    var new_ws_name = "SheetJS";
    
    /* make worksheet */
    var ws_data = [
      [ "S", "h", "e", "e", "t", "J", "S" ],
      [  1 ,  2 ,  3 ,  4 ,  5 ]
    ];
    var ws = XLSX.utils.aoa_to_sheet(ws_data);
    
    /* Add the worksheet to the workbook */
    XLSX.utils.book_append_sheet(wb, ws, ws_name);
    
    从头开始创建工作簿 (点击显示详情)

    工作簿对象包含一个SheetNames名称数组和一个Sheets对象,用来将表名映射到表对象。XLSX.utils.book_new工具函数创建一个新的工作簿对象:

    /* create a new blank workbook */
    var wb = XLSX.utils.book_new();
    

    新的工作簿是空白的而且不包含工作表。如果工作簿,那么写入函数将会出错。

    解析和编写示例

    node安装一个能够读取电子数据表和输出各种格式的命令行工具 xlsx。源码可以在 bin 目录下的xlsx.njs里面找到。

    XLSX.utils中的一些辅助函数会生成不同的工作表视图。

    • XLSX.utils.sheet_to_csv 生成CSV文件
    • XLSX.utils.sheet_to_txt 生成UTF16的格式化文本
    • XLSX.utils.sheet_to_html 生成HTML
    • XLSX.utils.sheet_to_json 生成一个对象数组
    • XLSX.utils.sheet_to_formulae 生成一张公示列表

    编写工作簿

    对编写而言,第一步是生成导出数据。辅助函数writewriteFile将会生成各种适合分发的数据格式。第二步是和端点实际的共享数据。假设workbook是一个工作簿对象。

    nodejs写入文件 (点击显示详情)

    XLSX.writeFile uses fs.writeFileSync in server environments:

    if(typeof require !== 'undefined') XLSX = require('xlsx');
    /* output format determined by filename */
    XLSX.writeFile(workbook, 'out.xlsb');
    /* at this point, out.xlsb is a file that you can distribute */
    
    Photoshop ExtendScript 写入文件 (点击显示详情)

    writeFileFile包裹在 Photoshop 和 other ExtendScript 目标里面。指定的路径应该是绝对路径。

    #include "xlsx.extendscript.js"
    /* output format determined by filename */
    XLSX.writeFile(workbook, 'out.xlsx');
    /* at this point, out.xlsx is a file that you can distribute */
    

    extendscript 示例包含有更复杂的例子。

    浏览器将TABLE元素添加到页面 (点击显示详情)

    sheet_to_html工具函数生成能被添加到任意DOM元素的HTML代码。

    var worksheet = workbook.Sheets[workbook.SheetNames[0]];
    var container = document.getElementById('tableau');
    container.innerHTML = XLSX.utils.sheet_to_html(worksheet);
    
    浏览器上传文件(ajax) (点击显示详情)

    XHR 的完整的复杂示例可以在 XHR示例 中查看,获取和包装器库的例子也可以包含在里面。例子中假设服务器能处理Base64编码的文件(查看基本的莫得服务器示例)。

    /* in this example, send a base64 string to the server */
    var wopts = { bookType:'xlsx', bookSST:false, type:'base64' };
    
    var wbout = XLSX.write(workbook,wopts);
    
    var req = new XMLHttpRequest();
    req.open("POST", "/upload", true);
    var formdata = new FormData();
    formdata.append('file', 'test.xlsx'); // <-- server expects `file` to hold name
    formdata.append('data', wbout); // <-- `data` holds the base64-encoded data
    req.send(formdata);
    
    浏览器保存文件 (点击显示详情)

    XLSX.writeFile 包含了一些用于触发文件保存的方法。

    • URL浏览器API为文件创建一个URL对象,通过创建a标签并给他添加click事件就可以使用URL对象。现代浏览器都支持这个方法。
    • msSaveBlob是IE10及IE10以上用来触发文件保存的API。
    • 对于Windows XP 和 Windows 7里面的IE6和IE6以上的以上浏览器,IE_FileSave 使用 VBScript 和 ActiveX 来写入文件。s补充程序(shim)必须包含在包含的HTML页面中。

    并没有标准的方法判断是否真实的文件已经被下载了。

    /* output format determined by filename */
    XLSX.writeFile(workbook, 'out.xlsb');
    /* at this point, out.xlsb will have been downloaded */
    
    浏览器保存文件(兼容性) (点击显示详情)

    XLSX.writeFile方法在大多数的现代浏览器以及老版本的浏览器中都能使用。对于更老的浏览器,wrapper库里面有变通的方法可以应用。

    FileSaver.js 执行 saveAs方法。

    注意:如果saveAs方法可以使用,XLSX.writeFile会自动调用。

    /* bookType can be any supported output type */
    var wopts = { bookType:'xlsx', bookSST:false, type:'array' };
    
    var wbout = XLSX.write(workbook,wopts);
    
    /* the saveAs call downloads a file on the local machine */
    saveAs(new Blob([wbout],{type:"application/octet-stream"}), "test.xlsx");
    

    Downloadify使用Flash SWF按钮生成本地文件,即使是ActiveX不能使用的环境也适用。

    Downloadify.create(id,{
    	/* other options are required! read the downloadify docs for more info */
    	filename: "test.xlsx",
    	data: function() { return XLSX.write(wb, {bookType:"xlsx", type:'base64'}); },
    	append: false,
    	dataType: 'base64'
    });
    

    oldie示例展示了IE向后兼容的场景。

    included demos包含了移动app和其他专门的部署。

    写入示例

    流式写入

    XLSX.stream对象中可以使用流式写入函数。流式函数像普通的函数一样传入相同的参数,不过返回一个可读流。但是他们只暴露在Nodejs中。

    • XLSX.stream.to_csvXLSX.utils.sheet_to_csv的流式版本。
    • XLSX.stream.to_htmlXLSX.utils.sheet_to_html的流式版本。
    • XLSX.stream.to_jsonXLSX.utils.sheet_to_json的流式版本。
    nodejs转换成CSV并写入文件 (点击显示详情)
    var output_file_name = "out.csv";
    var stream = XLSX.stream.to_csv(worksheet);
    stream.pipe(fs.createWriteStream(output_file_name));
    
    nodejs将JSON流输出到屏幕 (点击显示详情)
    /* to_json returns an object-mode stream */
    var stream = XLSX.stream.to_json(worksheet, {raw:true});
    
    /* the following stream converts JS objects to text via JSON.stringify */
    var conv = new Transform({writableObjectMode:true});
    conv._transform = function(obj, e, cb){ cb(null, JSON.stringify(obj) + "\n"); };
    
    stream.pipe(conv); conv.pipe(process.stdout);
    

    https://github.com/sheetjs/sheetaki pips将可写流写入nodejs响应。

    接口

    XLSX是浏览器暴露出来可以使用的方法,导出到node中能够使用的XLSX.versionXLSX库的版本(通过构建脚本添加)。XLSX.SSF格式化库的嵌入版本。

    解析函数

    XLSX.read(data, read_opts) 用来解析数据 data
    XLSX.readFile(filename, read_opts) 用来读取文件名 filename 并且解析。解析选项会在解析选项部分阐述。

    写入函数

    XLSX.write(wb, write_opts) 用来写入工作簿 wb
    XLSX.writeFile(wb, filename, write_opts)wb 写入到特定的文件 filename 中。如果是基于浏览器的环境,此函数会强制浏览器端下载。
    XLSX.writeFileAsync(filename, wb, o, cb)wb 写入到特定的文件 filename 中。如果 o 被省略,写入函数会使用第三个参数作为回调函数。

    XLSX.stream 包含一组流式写入函数的集合。

    写入选项会在写入选项部分部分进行阐述。

    工具

    XLSX.utils对象中的工具函数都可以使用,工具函数在工具函数部分进行阐述。

    导入:

    • aoa_to_sheet 把转换JS数据数组的数组为工作表。
    • json_to_sheet 把JS对象数组转换为工作表。
    • table_to_sheet 把DOM TABLE元素转换为工作表。
    • sheet_add_aoa 把JS数据数组的数组添加到已存在的工作表中。
    • sheet_add_json 把JS对象数组添加到已存在的工作表中。

    导出:

    • sheet_to_json 把工作表转换为JS对象数组。
    • sheet_to_csv 生成分隔符隔开值的输出。
    • sheet_to_txt 生成UTF16格式化的文本。
    • sheet_to_html 生成HTML输出。
    • sheet_to_formulae 生成公式列表(带有值回退)。

    单元格和单元格地址的操作:

    • format_cell 生成文本类型的单元格值(使用数字格式)。
    • encode_row / decode_row 在0索引行和1索引行之间转换。
    • encode_col / decode_col 在0索引列和列名之间转换。
    • encode_cell / decode_cell 转换单元格地址。
    • encode_range / decode_range 转换单元格的范围。

    常用的数据表格式(Common Spreadsheet Format)

    js-xlsx符合常用的数据表格式(CSF)。

    一般结构

    单元格地址对象的存储格式为{c:C, r:R},其中CR分别代表的是0索引列和行号。例如单元格地址B5用对象{c:1, r:4}表示。

    单元格范围对象存储格式为{s:S, e:E},其中S是第一个单元格,E是最后一个单元格。范围是包含关系。例如范围 A3:B7用对象{s:{c:0, r:2}, e:{c:1, r:6}}表示。当遍历数据表范围时,工具函数执行行优先命令。

    for(var R = range.s.r; R <= range.e.r; ++R) {
      for(var C = range.s.c; C <= range.e.c; ++C) {
        var cell_address = {c:C, r:R};
        /* if an A1-style address is needed, encode the address */
        var cell_ref = XLSX.utils.encode_cell(cell_address);
      }
    }
    

    单元格对象

    单元格对象是纯粹的JS对象,它的keys和values遵循下列的约定:

    KeyDescription
    v原始值(查看数据类型部分获取更多的信息)
    w格式化文本(如果可以使用)
    t内行: b Boolean, e Error, n Number, d Date, s Text, z Stub
    f单元格公式编码为A1样式的字符串(如果可以使用)
    F如果公式是数组公式,则包围数组的范围(如果可以使用)
    r富文本编码 (如果可以使用)
    h富文本渲染成HTML (如果可以使用)
    c与单元格关联的注释
    z与单元格关联的数字格式字符串(如果有必要)
    l单元格的超链接对象 (.Target 长联接, .Tooltip 是提示消息)
    s单元格的样式/主题 (如果可以使用)

    如果w文本可以使用,内置的导出工具(比如CSV导出方法)就会使用它。要想改变单元格的值,在打算导出之前确保删除cell.w(或者设置 cell.wundefined)。工具函数会根据数字格式(cell.z)和原始值(如果可用)重新生成w文本。

    真实的数组公式存储在数组范围中第一个单元个的f字段内。此范围内的其他单元格会省略f字段。

    数据类型

    原始值被存储在v值属性中,用来解释基于t类型的属性。这样的区别允许用于数字和数字类型文本的展示。下面有6种有效的单元格类型。

    TypeDescription
    bBoolean: 值可以理解为JS boolean
    eError: 值是数字类型的编码,而且w属性存储共同的名称 **
    nNumber: 值是JS number **
    dDate: 值是 JS Date 对象或者是被解析为Date的字符串 **
    sText: 值可以理解为 JS string 并且被写成文本 **
    zStub: 被数据处理工具函数忽略的空白子单元格 **
    Error 值以及含义 (点击显示详情)
    ValueError 含义
    0x00#NULL!
    0x07#DIV/0!
    0x0F#VALUE!
    0x17#REF!
    0x1D#NAME?
    0x24#NUM!
    0x2A#N/A
    0x2B#GETTING_DATA

    n表示Number类型。n包括了所有被Excel存储为数字的数据表,比如dates/times和Boolean字段。Excel专门使用能够被IEEE754浮点数表示的数据,比如JS Number,所以字段 v 保存原始数字。w字段保持格式化文本。Dates 默认存储为数字,使用XLSX.SSF.parse_date_code进行转换。

    类型 d表示日期类型,只有当选项为cellDates才会生成日期类型。因为JSON没有普通的日期类型,所以希望解析器存储的日期字符串像从date.toISOString()中获取的一样。另一方面,写入函数和导出函数也可以处理日期字符串和JS日期对象。需要注意Excel会忽略时区修饰符,并且处理所有本地时区的日期。代码库没有改正这个错误。

    类型z表示空白的存根单元格。生成存根单元格是为了以防万一单元格没有被赋予指定值,但是保留了注释或者是其他的元数据。存根单元格会被核心库的数据处理工具函数忽略。默认情况下不会生成存根单元格,只有当解析器sheetStubs的选项被设为true时才会生成。

    日期

    Excel 日期编码的细节 (点击显示详情)

    默认情况下,Excel把日期存储为数字,并用指定的日期处理格式编码进行处理。例如,日期19-Feb-17被存储为数字42785,数字格式为d-mmm-yySSF模块了解数字格式并进行适当的转换。

    XSLX也支持特定的日期类型d,它的数据是ISO 8601日期字符串。格式化工具把日期还原为数字。

    所有解析器的默认行为是生成数字单元格。设置cellDates为true会强制生成器存储日期。

    时区和日期 (点击显示详情)

    Excel没有原生的通用时间的概念。所有的时间都会在本地时区指定。Excel限制指定真正的绝对日期。

    对于下面的Excel,代码库将所有的日期视为相对于当地时区的日期。

    时期:1900年和1904年 (点击显示详情)

    Excel支持两种时期(January 1 1900和January 1 1904),查看"1900 vs. 1904 Date System" article。工作簿的时期可以通过测试工作簿的wb.Workbook.WBProps.date1904属性来决定:

    !!(((wb.Workbook||{}).WBProps||{}).date1904)
    

    数据表对象

    每一个不以!开始的key都会映射到一个单元格(用A-1符合)。sheet[address] 返回指定地址的单元格对象。

    指定的数据表属性(通过 sheet[key]访问, 每一个都以 !开始):

    • sheet['!ref']:A-1的范围是基于表示数据表的范围。操作数据表的函数应该使用这个参数来决定操作范围。此范围之外指定的单元格不会被处理。尤其是手动编写数据表时,范围之外的单元格不会被包含在其中。

    处理数据表的函数应该对!ref的存在进行检测。如果!ref被忽略或者不是有效的范围,函数就可以吧数据表看做是空表或者尝试猜范围。词库附带的工具函数会将工作表视为空(例如CSV的输出是空字符串)。

    当用sheetRows属性集读取工作表时,ref参数会使用限制的范围。最初的范围通过ws['!fullref']设置。

    • sheet['!margins']sheet['!margins']对象表示页面的边距。默认值遵循Excel的常规设置。Excel也有"wide"和"narrow"的设置,不过他们都被存储为原生的尺寸。主要的属性已在下表列出:
    页面边距详情 (点击显示详情)
    keydescription“normal”“wide”“narrow”
    leftleft margin (inches)0.71.00.25
    rightright margin (inches)0.71.00.25
    toptop margin (inches)0.751.00.75
    bottombottom margin (inches)0.751.00.75
    headerheader margin (inches)0.30.50.3
    footerfooter margin (inches)0.30.50.3
    /* Set worksheet sheet to "normal" */
    ws["!margins"]={left:0.7, right:0.7, top:0.75,bottom:0.75,header:0.3,footer:0.3}
    /* Set worksheet sheet to "wide" */
    ws["!margins"]={left:1.0, right:1.0, top:1.0, bottom:1.0, header:0.5,footer:0.5}
    /* Set worksheet sheet to "narrow" */
    ws["!margins"]={left:0.25,right:0.25,top:0.75,bottom:0.75,header:0.3,footer:0.3}
    

    工作表对象

    除了基本的数据表关键字之外,工作表还增加了下面的内容:

    • ws['!cols']:返回列属性对象的数组。实际上的列宽使用统一的方式存储在文件里,宽度的测量依据最大数字宽度(在像素中,最大的渲染宽度是数字0-9)。渲染时,列对象用wpx字段存储像素宽度,用wch存储字符宽度,用MDW字段存储最大数字宽度。

    • ws['!rows']: 返回行属性对象的数组,后面的文档会进行阐述。每一个行对象编码属性包括行高和能见度。

    • ws['!merges']: 返回与工作表中合并单元格相对应的范围对象的数组。纯文本格式不支持合并单元格。如果合并的单元格存在,CSV导出将会把所有的单元格写入合并范围,因此确保在合并的范围内只有第一个单元格(左上角的单元格)被设置。

    • ws['!protect']: 写入数据表保护属性的对象。password键为支持密码保护的数据表(XLSX/XLSB/XLS)指定密码。写入函数会使用XOR模糊方式。下面key控制数据表保护–数据表被锁定时设置key为false可以使用feature,或者设为true禁用feature。

    工作表保护详情 (点击显示详情)
    keyfeature (true=disabled / false=enabled)default
    selectLockedCellsSelect locked cellsenabled
    selectUnlockedCellsSelect unlocked cellsenabled
    formatCellsFormat cellsdisabled
    formatColumnsFormat columnsdisabled
    formatRowsFormat rowsdisabled
    insertColumnsInsert columnsdisabled
    insertRowsInsert rowsdisabled
    insertHyperlinksInsert hyperlinksdisabled
    deleteColumnsDelete columnsdisabled
    deleteRowsDelete rowsdisabled
    sortSortdisabled
    autoFilterFilterdisabled
    pivotTablesUse PivotTable reportsdisabled
    objectsEdit objectsenabled
    scenariosEdit scenariosenabled
    • ws['!autofilter']: 自动筛选下面的模式:
    type AutoFilter = {
      ref:string; // A-1 based range representing the AutoFilter table range
    }
    

    图表对象

    图表会被显示为标准的数据表。要注意和!type被设置为"chart"的属性进行区分。

    底层数据和!ref指的是图表中的缓存数据。 图表的第一行是底层标题。

    宏对象

    宏对象会被显示为标准的数据表。注意与!type设置为"macro"的属性进行区分。

    对话框对象

    对话框对象会被显示为标准的数据表。注意与!type设置为"dialog"的属性进行区分。

    工作簿对象

    workbook.SheetNames 是工作簿内工作表的有序列表。

    wb.Sheets[sheetname] 返回一个表示工作表的对象。

    wb.Props 是一个存储标准属性的对象。wb.Custprops 存储自定义的属性。因为XLS标准属性偏离了XLSX标准,所以XLS解析把核心的属性存储在两个属性中。

    wb.Workbook 存储工作簿级别的特性.

    工作簿文件属性

    各种各样的文件格式为不同的文件属性使用不同的内置名称。工作簿的Props对象用来规范这些名称。

    文件属性 (点击显示详情)
    JS NameExcel Description
    TitleSummary tab “Title”
    SubjectSummary tab “Subject”
    AuthorSummary tab “Author”
    ManagerSummary tab “Manager”
    CompanySummary tab “Company”
    CategorySummary tab “Category”
    KeywordsSummary tab “Keywords”
    CommentsSummary tab “Comments”
    LastAuthorStatistics tab “Last saved by”
    CreatedDateStatistics tab “Created”

    例如设置工作簿的title属性:

    if(!wb.Props) wb.Props = {};
    wb.Props.Title = "Insert Title Here";
    

    自定义的属性会被添加到工作簿的Custom对象中:

    if(!wb.Custprops) wb.Custprops = {};
    wb.Custprops["Custom Property"] = "Custom Value";
    

    写入函数将会处理选项对象的Props键:

    /* force the Author to be "SheetJS" */
    XLSX.write(wb, {Props:{Author:"SheetJS"}});
    

    工作簿级别的特性

    wb.Workbook 存储工作簿级别的特性。

    定义名称

    wb.Workbook.Names 是一个定义名称对象的数组,这些名称对象都有键:

    定义名称属性 (点击显示)
    KeyDescription
    Sheet名称的范围。 数据表的索引 (0 = 第一章张数据表) 或null (工作簿)
    Name区分大小写的名称。 标准的规则应用**
    RefA1单元格样式的引用 ("Sheet1!$A$1:$D$20")
    Comment注释 (只适用于XLS/XLSX/XLSB)

    Excel 允许两个表格范围定义的名称共享相同的名称。但是一个表格范围的名称不能和一个工作簿范围的名称相冲突。工作簿写入函数不强制这样的约束。

    工作簿视图

    wb.Workbook.Views 是一个工作簿视图对象数组,这些视图对象有keys。

    KeyDescription
    RTL如果值为true,从左到右的显示

    混合的工作簿属性

    KeyDescription
    CodeNameVBA Project Workbook Code Name
    date1904时间: 0/false 表示1900系统时间, 1/true 表示1904系统时间
    filterPrivacy警告或去除存储的个人验证信息

    文档特点

    即使是想存储数据这样的基本特点,官方的Excel格式也会用不同的方式存储相同的内容。期望解析器从底层文件格式转换为通用的电子表格格式。期望编写器将CSF格式转换回基本的文件格式。

    公式

    A1单元格样式字符串被存储在f字段中。虽然不同的文件格式用不同的方式存储文件格式,不过这些格式都需要被翻译。虽然一些格式存储的公式有一个前导等号,但是CSF公式不以=开始。

    A1=1, A2=2, A3=A1+A2的显示 (点击展示详情)
    {
      "!ref": "A1:A3",
      A1: { t:'n', v:1 },
      A2: { t:'n', v:2 },
      A3: { t:'n', v:3, f:'A1+A2' }
    }
    

    共享的公式会被解压缩,并且每一个单元格都有相应的公式。编写器通常不会尝试去生成共享公式。

    有公式记录但是没有值的单元格会被序列化,序列化的方式能够被Excel和其他电子表格工具将会识别。这个代码库将不会自动计算公式结果!例如去计算工作表中的BESSELJ

    没有已知值的公式 (点击显示详情)
    {
      "!ref": "A1:A3",
      A1: { t:'n', v:3.14159 },
      A2: { t:'n', v:2 },
      A3: { t:'n', f:'BESSELJ(A1,A2)' }
    }
    

    数组公式

    数组公式被存储在数组块左上角的单元格内。一个数组公式的所有单元格都会有于该范围对应的F字段。一个单一的单元格公式要注意于F字段所存储的纯公式进行区分。

    数组公式示例 (点击显示详情)

    例如设置单元格C1为数组公式{=SUM(A1:A3*B1:B3)}

    worksheet['C1'] = { t:'n', f: "SUM(A1:A3*B1:B3)", F:"C1:C1" };
    

    对于多个单元格的数组公式,每一个单元格都有相同的数组范围,不过只有第一个单元格指定公式。考虑D1:D3=A1:A3*B1:B3

    worksheet['D1'] = { t:'n', F:"D1:D3", f:"A1:A3*B1:B3" };
    worksheet['D2'] = { t:'n', F:"D1:D3" };
    worksheet['D3'] = { t:'n', F:"D1:D3" };
    

    工具函数和编写器被用来检查F字段的存在,并且忽略单元格内任何可能的公式元素f,这些单元格并不包含起始单元格。这些操作函数并不会被要求执行公式的校验。

    公式输出工具函数 (点击显示详情)

    sheet_to_formulae方法生成为每个公式或者是数组公式生成一行。数组公式被渲染在range=formula的表格内,而纯单元格被渲染在cell=formula or value的表格内。注意字符串的迭代会有前缀符号',与Excel公式栏显示的一致。

    公式文件格式细节 (点击显示详情)
    Storage RepresentationFormatsReadWrite
    A1-style stringsXLSX⭕️⭕️
    RC-style stringsXLML and plain text⭕️⭕️
    BIFF Parsed formulaeXLSB and all XLS formats⭕️
    OpenFormula formulaeODS/FODS/UOS⭕️⭕️

    因为Excel禁止单元格的命名与A1的名称或者是RC样式单元格引用相冲突,可能会进行不是那么简单的正则变化。DIFF解析的公式必须被明确的解开。OpenFormula可以转换正则表达式。

    列属性

    每张表都会有!cols数组,如果展开的话就是ColInfo的一个集合,有下列的属性:

    type ColInfo = {
      /* visibility */
      hidden?: boolean; // if true, the column is hidden
    
      /* column width is specified in one of the following ways: */
      wpx?:    number;  // width in screen pixels
      width?:  number;  // width in Excel's "Max Digit Width", width*256 is integral
      wch?:    number;  // width in characters
    
      /* other fields for preserving features from files */
      MDW?:    number;  // Excel's "Max Digit Width" unit, always integral
    };
    
    为什么有三种宽度类型? (点击显示详情) 有三种不同的宽度类型对应于电子数据表存储列宽的三种不同方式。

    SYLK和其他的纯文本格式使用原生的字符计算。像Visicalc和Multiplan这样的同时期的工具是基于字符的。因为字符有相同的宽度,足以存储一个计数。这样的传统也延续到了BIFF格式。

    SpreadsheetML (2003) 尝试通过标准化整个文件中的屏幕像素计数来与HTML对齐。列宽、行高以及其他的测量使用像素。当像素和字符数量不一致时,Excel四舍五入结果。

    XLSX内部用一个模糊的"最大数位宽度"表存储列宽。最大数字宽度是渲染时最大数字的宽度,通常字符"0"是最宽的。内部的宽度必须是宽度除以256的整数倍。ECMA-376介绍了一个公式用于像素和内部宽度之间的转换。这代表一种混合的方式。

    读取函数尝试去填充全部的三种属性。写函数努力尝试将指定值循环到所需类型。为了阻止潜在的冲突。首先操作应该要删除其他的属性。列入,当改变像素宽度时,删除wchwidth属性。

    执行细节 (点击显示详情)

    给出的这些约束可能决定了MDW没有检查字体!解析器通过从宽度转换为像素并返回来猜测像素宽度,重复所有可能的MDW并选择最小化村务的MDW。XLML实际上存储额像素宽度,所以猜想会在相反的方向运行。

    即使所有的信息都是可用的,也会期望写入函数遵循下面的优先级顺序:

    1. 如果 width 字段可用,优先使用width
    2. 如果 wpx 字段可用,请使用wpx
    3. 如果 wch 字段可用,请使用wch

    行属性

    如果!rows 数组在每张电子表中都存在,那就是一个RowInfo对象的集合,集合包含一下的属性:

    type RowInfo = {
      /* visibility */
      hidden?: boolean; // if true, the row is hidden
    
      /* row height is specified in one of the following ways: */
      hpx?:    number;  // height in screen pixels
      hpt?:    number;  // height in points
    
      level?:  number;  // 0-indexed outline / group level
    };
    

    注意:Excel UI显示基本大纲级别为1,最大级别为8level字段存储基本大纲级别为0,最大级别为7

    实现细节 (点击展示详情)

    Excel内部以点为单位存储行高。默认的分辨率是72DPI或者是96DPI,所以像素和点的大小应该相同。不同的分辨率他们可能不同,因此库分开了这些概念:

    即使所有的信息都可用,写入函数也应该遵循下面的优先级顺序:
    1)如果hpx可用,就使用 hpx像素高度。
    2) 如果hpx可用,就使用 hpx像素高度。

    数字格式

    对于每一个单元格而言,cell.w的文本来自于cell.vcell.z格式。如果格式没有指定,ExcelGeneral格式就会被使用。格式要么是指定的的字符串要么是格式表内的一个索引。解析器应该用数字格式表来填充workbook.SSF。写入函数用来序列化这个表。

    自定义的工具应该确保本地表的表内有各自的格式字符串。Excel约定规定自定义的格式以索引164开头。下面的例子从头创建了一个自定义的格式:

    自定义格式的新工作簿 (点击显示详情)
    var wb = {
      SheetNames: ["Sheet1"],
      Sheets: {
        Sheet1: {
          "!ref":"A1:C1",
          A1: { t:"n", v:10000 },                    // <-- General format
          B1: { t:"n", v:10000, z: "0%" },           // <-- Builtin format
          C1: { t:"n", v:10000, z: "\"T\"\ #0.00" }  // <-- Custom format
        }
      }
    }
    

    这些规则和Excel如何显示自定义的数字格式稍微有些区别。特别是文字字符必须必包含在双引号里面或者在反斜杠之前。更多信息,查看Excel文档Create or delete a custom number format 或者是ECMA-376 18.8.31(数字格式)。

    默认的数字格式 (点击展示详情)

    ECMA-376 18.8.30里列出的默认格式:

    IDFormat
    0General
    10
    20.00
    3#,##0
    4#,##0.00
    90%
    100.00%
    110.00E+00
    12# ?/?
    13# ??/??
    14m/d/yy (see below)
    15d-mmm-yy
    16d-mmm
    17mmm-yy
    18h:mm AM/PM
    19h:mm:ss AM/PM
    20h:mm
    21h:mm:ss
    22m/d/yy h:mm
    37#,##0 ;(#,##0)
    38#,##0 ;[Red](#,##0)
    39#,##0.00;(#,##0.00)
    40#,##0.00;[Red](#,##0.00)
    45mm:ss
    46[h]:mm:ss
    47mmss.0
    48##0.0E+0
    49@

    格式14(m/d/yy)被Excel本地化:即使文件指明了数字格式,也会根据系统设置用不同的方式绘制。当文件的的生产者和使用者都在相同的区域时这会很有用,不过对于网络上的例子就会不同。为了避免歧义,解析函数接受dateNF选项覆盖指定格式字符串的解释。

    超链接

    超链接存储在单元格对象的l关键字内。超链接对象的Target字段是连接目标,包括了URI片段。工具提示被存储在Tooltip字段内,当移动鼠标到文字上方就会显示。

    例如下方的片段在单元格A3内创建了一个指向http://sheetjs.com的链接,提示信息是"Find us @ SheetJS.com!"

    ws['A3'].l = { Target:"http://sheetjs.com", Tooltip:"Find us @ SheetJS.com!" };
    

    注意Excel并不会自动为超链接添加样式–他们通常会向普通文本一样显示。

    如果链接的目标是一个单元格或者是范围又或者是在相同的工作簿内定义名字(“Internal Links”),那么链接的开头会有一个哈希字符标识:

    ws['A2'].l = { Target:"#E2" }; /* link to cell E2 */
    

    单元格注释

    单元格注释是对象,被存储在单元格对象的c数组内。实际上注释的内容根据注释的作者被分成了小块。每一个注释对象的a字段存储注释的作者,t字段是注释的纯文字展示。

    例如下面的片段在单元格A1内添加了单元格注释:

    if(!ws.A1.c) ws.A1.c = [];
    ws.A1.c.push({a:"SheetJS", t:"I'm a little comment, short and stout!"});
    

    注意:XLSB对作者的名字施加54个字符的限制。名字的长度超过54个字符可能造成其他的格式问题。

    把注释标记为普通的隐藏,只需设置hidden属性:

    if(!ws.A1.c) ws.A1.c = [];
    ws.A1.c.push({a:"SheetJS", t:"This comment is visible"});
    
    if(!ws.A2.c) ws.A2.c = [];
    ws.A2.c.hidden = true;
    ws.A2.c.push({a:"SheetJS", t:"This comment will be hidden"});
    

    数据表能见度

    Excel支持将表格隐藏在更低的标签栏。表格数据存储文件内,但是UI不容易让它可以使用。标准的隐藏表格会被显示在"Unhide"菜单内。Excel也有"very hidden"表格,这些表格不能被显示在菜单内。只可以通过Vb编辑器访问。

    能见度的设置被存储在表格属性数组的Hidden属性当中。

    更多细节 (点击显示详情)
    ValueDefinition
    0Visible
    1Hidden
    2Very Hidden

    更多详情请查看https://rawgit.com/SheetJS/test_files/master/sheet_visibility.xlsx

    > wb.Workbook.Sheets.map(function(x) { return [x.name, x.Hidden] })
    [ [ 'Visible', 0 ], [ 'Hidden', 1 ], [ 'VeryHidden', 2 ] ]
    

    非Excel格式不支持"Very Hidden"状态。测试一个数据比哦啊是否可见的最好方式是检查是否Hidden属性为逻辑truth:

    > wb.Workbook.Sheets.map(function(x) { return [x.name, !x.Hidden] })
    [ [ 'Visible', true ], [ 'Hidden', false ], [ 'VeryHidden', false ] ]
    

    VBA和宏命令

    VBA宏命令存储在特殊的数据blob中,当bookVBA选项为true时,blob会暴露在工作簿对象的vbaraw属性中。VBA宏命令支持 XLSM, XLSB, 和 BIFF8 XLS 格式。如果blob存在于工作簿中,并且和工作簿的名字有关联,支持的格式写入函数会自动插入数据blob。

    自定义编码名称 (点击显示)

    工作簿编码名称存储在wb.Workbook.WBProps.CodeName中。默认情况下Excel将会设置成ThisWorkbook或者是一个翻译的短语比如DieseArbeitsmappe。工作表和图表的编码名称在工作表属性对象的wb.Workbook.Sheets[i].CodeName中。宏数据表和对话数据表会被忽略。

    读取函数和写入函数会保护编码名称,但是当在一个不同的工作簿内增加一个VBA blob时,编码名称必须被手动设置。

    宏数据表 (点击显示)

    老版本的Excel也支持非VBA的宏数据表表格类型,宏数据表存储了一些自动命令。他们暴露在!type设置成"macro"的对象中。

    检测工作簿内宏指令 (点击显示) 如果宏指令存在,那么`vbaraw`字段就可以被设置,所以测试简单:
    function wb_has_macro(wb/*:workbook*/)/*:boolean*/ {
    	if(!!wb.vbaraw) return true;
    	const sheets = wb.SheetNames.map((n) => wb.Sheets[n]);
    	return sheets.some((ws) => !!ws && ws['!type']=='macro');
    }
    

    解析选项

    导出的readreadFile函数接受选项参数:

    Option NameDefaultDescription
    type输入数据编码 (查看下方的输入类型)
    rawfalse如果为true,纯文本解析不会解析值 **
    codepage如果指定, 合适的时候使用编码页面**
    cellFormulatrue保存公式到f字段
    cellHTMLtrue解析富文本并把HTML保存到.h 字段
    cellNFfalse把数字格式的字符串保存到 .z 字段
    cellStylesfalse把样式/主题保存到 .s 字段
    cellTexttrue生成格式化文本.w 字段
    cellDatesfalse把日期存储为类型 d (默认是 n)
    dateNF如果指定,使用代码日期14的字符串 **
    sheetStubsfalse为子单元格创建z类型的单元格对象
    sheetRows0如果sheetRows的值 >0, 读取第一个sheetRows 行 **
    bookDepsfalse值为true,解析计算链
    bookFilesfalse如果值为true, 添加原始文件到工作簿对象 **
    bookPropsfalse如果值为true, 只有足够的解析才能得到工作簿的元数据**
    bookSheetsfalse如果值为true,只有足够的解析才能得到表格名称
    bookVBAfalse如果值为true,复制 VBA blob 到 vbaraw 字段 **
    password“”如果定义了密码并且文件已经加密,就会使用密码 **
    WTFfalse如果值为true, 对意外的文件特性抛出错误 **
    • 虽然cellNF为false,但是格式化的文本也会被生成并且保存到.w字段。
    • 在一些情况下,即使bookSheets为false,数据表也可能被解析。
    • Excel积极尝试从CSV和其他纯文本中解释值。这会导致意外的行为!raw选项抑制值解析。
    • bookSheetsbookProps 结合起来提供两套信息集合。
    • Deps将会是一个空对象,如果bookDeps为false。
    • bookFiles的行为依赖于文件类型:
      • keys 数组(ZIP里面的路径)用于基于ZIP基础的格式
      • files哈希(将路径映射到表示文件的的对象)用于ZIP
      • cfb对象用于使用CFB容器的格式
    • sheetRows-1将会在查看JSON对象输出时生成(因为解析数据时,数据头行会被计算成一行)
    • bookVBA仅仅在xl/vbaProject.bin展示原始的VBA CFB对象。不解析数据。XLSM 和 XLSB把VBA CFB对象存储在xl/vbaProject.bin。BIFF8 XLS将VBA条目与核心工作簿条目混合在一起,因此库从XLS CFB容器生成了一个新的XLSB兼容blob。
    • codepage用于没有CodePage记录的BIFF2 - BIFF5文件以及在type:"binary"内没有BOM的CSV文件。
    • 目前仅支持XOR加密。当文件使用其他的加密方法时会抛出不支持的错误。
    • WTF主要用于发展。默认情况下,单一的工作表内,解析器将会抑制读取错误,允许你从解析正确的工作表内读取。设置WTF:1强制这些错误被抛出。

    输入类型

    字符串能用很多种方式解释。readtype参数告诉库如何解析数据参数:

    typeexpected input
    "base64"字符串: 文件的Base64编码
    "binary"字符串: 二进制字符串 (字节 ndata.charCodeAt(n))
    "string"字符串: JS字符串 (字符被解释为UTF8)
    "buffer"nodejs Buffer
    "array"数组: 8位的无符号型整数数组 (字节 ndata[n])
    "file"字符串: 将要被读取的文件的路径 (只在nodejs中可用)

    猜测文件类型

    实现细节 (点击显示详情)

    Excel和其他的电子数据表格工具读取前几个字节并且应用试探法确定稳定类型。这个支持文件类型的双关:用.xls扩展的重命名文件会告诉你的电脑使用Excel打开文件而且Excel知道如何去处理它。这个库应用了相似的逻辑:

    Byte 0Raw File TypeSpreadsheet Types
    0xD0CFB ContainerBIFF 5/8 or password-protected XLSX/XLSB or WQ3/QPW
    0x09BIFF StreamBIFF 2/3/4/5
    0x3CXML/HTMLSpreadsheetML / Flat ODS / UOS1 / HTML / plain text
    0x50ZIP ArchiveXLSB or XLSX/M or ODS or UOS2 or plain text
    0x49Plain TextSYLK or plain text
    0x54Plain TextDIF or plain text
    0xEFUTF8 EncodedSpreadsheetML / Flat ODS / UOS1 / HTML / plain text
    0xFFUTF16 EncodedSpreadsheetML / Flat ODS / UOS1 / HTML / plain text
    0x00Record StreamLotus WK* or Quattro Pro or plain text
    0x7BPlain textRTF or plain text
    0x0APlain textSpreadsheetML / Flat ODS / UOS1 / HTML / plain text
    0x0DPlain textSpreadsheetML / Flat ODS / UOS1 / HTML / plain text
    0x20Plain textSpreadsheetML / Flat ODS / UOS1 / HTML / plain text

    DBF文件会基于前几个字节以及第三个和第四个字节进行检测(对应于文件日期的月和天)。

    纯文本格式的猜测遵循下面的优先级顺序:

    FormatTest
    XML<?xml 出现在前1024个字符
    HTML<开头并且HTML标签出现在前1024个字符 *
    XML<开头
    RTF{\rt开头
    DSV/sep=.$/开头,分隔符是指定的字符串
    DSV前1024个字符中未引用的";" 字符比 "\t" 或者 ","
    TSV前1024个字符中未引用的"\t"字符比 ","
    CSV前1024个字符中的一个是逗号","
    ETHsocialcalc:version:开头
    PRN(默认)
    • HTML 标签包括:html, table, head, meta, script, style, div
    为什么随机的文本文件合法? (点击显示详情) Excel在读取文件方面非常积极。添加一个XLS 扩展到任意的显示文件,让Excel认为该文件可能是一个CSV或者是TSV文件,即使它仅仅是一列!这个库尝试去复制那样的行为。

    最好的方法是去校验想要得到的工作表并且确保它有期待的行数或列数。提取范围非常简单:

    var range = XLSX.utils.decode_range(worksheet['!ref']);
    var ncols = range.e.c - range.s.c + 1, nrows = range.e.r - range.s.r + 1;
    

    写入选项

    导出的writewriteFile函数接受一个选型参数:

    Option NameDefaultDescription
    type输出数据编码(查看下面的输出类型)
    cellDatesfalse把字节存储为类型d (默认是 n)
    bookSSTfalse生成共享的字符串表格 **
    bookType"xlsx"工作簿的类型 (查看下方支持的格式)
    sheet""单页格式的工作表名称 **
    compressionfalse基于ZIP的格式使用ZIP压缩 **
    Props写入时覆盖工作簿的属性 **
    themeXLSX写入XLSX/XLSB/XLSM时,覆盖主题XML **
    ignoreECtrue禁止"数字作为文本"错误 **
    • bookSST 较慢并且有更多的内存密集型,不过与iOS数字老版本有更好的兼容性。
    • 原始数据时唯一保证存储的东西。在README文件中没有描述的功能可能无法序列化。
    • cellDates 仅用于XLSX输出并且不能保证与第三方读取器一起工作。Excel自身不经常用类型d编写单元格,因此非Excel工具会忽视数据或者是有日期错误。
    • Props是一个备份工作簿Props字段的对象。从工作簿文件属性 部分查看表格。
    • 如果指定,来自themeXLSX的字符串会被存储为XLSX/XLSB/XLSM文件的基本主题(ZIP中的xl / theme / theme1.xml)。
    • 由于在程序中有一个bug,一些功能比如"分列"会在忽略错误条件的工作表上使Excel崩溃。默认情况下写入函数将会标记文件忽略错误。设置ignoreECfalse来禁止。

    支持的输出格式

    与第三方工具的广泛兼容性,这个库支持很多种输出格式。明确的文件类型被bookType选项控制:

    bookTypefile extcontainersheetsDescription
    xlsx.xlsxZIPmultiExcel 2007+ XML Format(XML 格式)
    xlsm.xlsmZIPmultiExcel 2007+ Macro XML Format(宏 XML 格式)
    xlsb.xlsbZIPmultiExcel 2007+ Binary Format(二进制格式)
    biff8.xlsCFBmultiExcel 97-2004 Worksheet Format(工作簿格式)
    biff5.xlsCFBmultiExcel 5.0/95 Worksheet Format(工作簿格式)
    biff2.xlsnonesingleExcel 2.0 Worksheet Format(工作簿格式)
    xlml.xlsnonemultiExcel 2003-2004 (SpreadsheetML)
    ods.odsZIPmultiOpenDocument Spreadsheet(开放文档格式的电子表格)
    fods.fodsnonemultiFlat OpenDocument Spreadsheet(平滑的开放文档格式的电子表格)
    csv.csvnonesingleComma Separated Values(逗号分隔值)
    txt.txtnonesingleUTF-16 Unicode Text (TXT)
    sylk.sylknonesingleSymbolic Link (SYLK)
    html.htmlnonesingleHTML Document
    dif.difnonesingleData Interchange Format (DIF) (数据交换格式)
    dbf.dbfnonesingledBASE II + VFP Extensions (DBF)(dBASE II + VFP扩展)
    rtf.rtfnonesingleRich Text Format (RTF)
    prn.prnnonesingleLotus Formatted Text(Lotus格式化文本。)
    eth.ethnonesingleEthercalc Record Format (ETH)(Ethercalc记录格式)
    • compression仅用于带ZIP容器的格式。
    • 格式只支持需要sheet选型指明工作表的单表。如果字符串为空,就会使用第一张工作表。
    • 如果bookType未指定值,那么writeFile会自动根据文件扩展名来猜测输出文件格式。他就会在上表中选择匹配扩展名的第一个格式。

    输出类型

    write函数的type参数备份read函数的type参数:

    typeoutput
    "base64"字符串: 文件的Base64编码
    "binary"字符串: 二进制字符串 (字节 ndata.charCodeAt(n))
    "string"字符串: JS 字符串 (字符被解释成UTF8)
    "buffer"nodejs Buffer
    "array"ArrayBuffer, 8位无符号整数的回退数组
    "file"字符串: 将要创建的文件的地址(仅用于nodejs)

    工具函数

    sheet_to_*函数接受一张工作表以及一个可选的选项对象。
    *_to_sheet函数接受一个数据对象以及一个可选的选项对象。
    示例都是基于下面的工作表:

    XXX| A | B | C | D | E | F | G |
    ---+---+---+---+---+---+---+---+
     1 | S | h | e | e | t | J | S |
     2 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
     3 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
    

    数组的数组输入

    XLSX.utils.aoa_to_sheet获取JS值数组的数组,并且返回一个工作表寻找输入数据。Numbers,Booleans和Strings都被存储为相应的样式。Date被存储为date或者是numbers。跳过数组孔和显式“未定义”值。null值可能被剔除。所有其它值存储为字符串。函数获取选项参数:

    Option NameDefaultDescription
    dateNFFMT 14字符串输出使用特定的日期格式
    cellDatesfalse存储日期为类型 d (默认是 n)
    sheetStubsfalsenull值创建类型为z的单元格对象
    例子 (点击显示) 生成实例表:
    var ws = XLSX.utils.aoa_to_sheet([
      "SheetJS".split(""),
      [1,2,3,4,5,6,7],
      [2,3,4,5,6,7,8]
    ]);
    

    XLSX.utils.sheet_add_aoa获取JS值的数组的数组,并且更新一个已存在的工作表对象。它遵循和aoa_to_sheet一样的过程,并且接受一个选项参数:

    Option NameDefaultDescription
    dateNFFMT 14字符串输出使用指定的日期格式
    cellDatesfalse存储日期为类型 d (默认是 n)
    sheetStubsfalsenull值创建类型为z的单元格对象
    origin只用指定的单元格作为指定的起点 (查看下表)

    origin应该是以下之一:

    originDescription
    (cell object)使用指定的单元格 (单元格对象)
    (string)使用指定的单元格 (A1样式的单元格)
    (number >= 0)从指定行的第一列开始 (0索引)
    -1从第一列开始添加到工作表底部
    (default)从单元格A1开始
    示例 (点击显示)

    考虑工作表:

    XXX| A | B | C | D | E | F | G |
    ---+---+---+---+---+---+---+---+
     1 | S | h | e | e | t | J | S |
     2 | 1 | 2 |   |   | 5 | 6 | 7 |
     3 | 2 | 3 |   |   | 6 | 7 | 8 |
     4 | 3 | 4 |   |   | 7 | 8 | 9 |
     5 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
    

    此工作表可按照顺序A1:G1, A2:B4, E2:G4, A5:G5构建:

    /* Initial row */
    var ws = XLSX.utils.aoa_to_sheet([ "SheetJS".split("") ]);
    
    /* Write data starting at A2 */
    XLSX.utils.sheet_add_aoa(ws, [[1,2], [2,3], [3,4]], {origin: "A2"});
    
    /* Write data starting at E2 */
    XLSX.utils.sheet_add_aoa(ws, [[5,6,7], [6,7,8], [7,8,9]], {origin:{r:1, c:4}});
    
    /* Append row */
    XLSX.utils.sheet_add_aoa(ws, [[4,5,6,7,8,9,0]], {origin: -1});
    

    对象数组输入

    XLSX.utils.json_to_sheet获取对象数组并且返回一张基于对象自动生成"headers"的工作表。默认的列顺序由第一次出现的字段决定,这些字段通过使用Object.keys得到,不过可以使用选项参数覆盖。

    Option NameDefaultDescription
    header使用指定的列顺序 (默认 Object.keys)
    dateNFFMT 14字符串输出使用指定的日期格式
    cellDatesfalse存储日期为类型 d (默认是 n)
    skipHeaderfalse如果值为true, 输出不包含header行
    示例 (点击显示)

    原始的表单不能以明显的方法复制,因为JS对象的keys必须是独一无二的。之后用e_1S_1替换第二个eS

    var ws = XLSX.utils.json_to_sheet([
      { S:1, h:2, e:3, e_1:4, t:5, J:6, S_1:7 },
      { S:2, h:3, e:4, e_1:5, t:6, J:7, S_1:8 }
    ], {header:["S","h","e","e_1","t","J","S_1"]});
    

    或者可以跳过header行:

    var ws = XLSX.utils.json_to_sheet([
      { A:"S", B:"h", C:"e", D:"e", E:"t", F:"J", G:"S" },
      { A: 1,  B: 2,  C: 3,  D: 4,  E: 5,  F: 6,  G: 7  },
      { A: 2,  B: 3,  C: 4,  D: 5,  E: 6,  F: 7,  G: 8  }
    ], {header:["A","B","C","D","E","F","G"], skipHeader:true});
    

    XLSX.utils.sheet_add_json获取一个对象数组,并且更新一个已存在的工作表对象。与json_to_sheet一样有相同的过程,并且接受一个选项参数:

    Option NameDefaultDescription
    header使用指定的列排序 (默认 Object.keys)
    dateNFFMT 14字符串输出使用指定的日期格式
    cellDatesfalse把存储日期为类型 d (默认是 n)
    skipHeaderfalse如果值为true, 输出不包含header行
    origin使用指定的单元格作为起点 (查看下方表格)

    origin应该是以下之一:

    originDescription
    (cell object)使用指定的单元格(单元格对象)
    (string)使用指定的单元格 (A1样式的单元格)
    (number >= 0)从指定行的第一列开始(0索引)
    -1从第一列开始添加到工作表底部
    (default)从单元格A1开始
    例子 (点击展示) 考虑工作表:
    XXX| A | B | C | D | E | F | G |
    ---+---+---+---+---+---+---+---+
     1 | S | h | e | e | t | J | S |
     2 | 1 | 2 |   |   | 5 | 6 | 7 |
     3 | 2 | 3 |   |   | 6 | 7 | 8 |
     4 | 3 | 4 |   |   | 7 | 8 | 9 |
     5 | 4 | 5 | 6 | 7 | 8 | 9 | 0 |
    

    工作表能够以A1:G1, A2:B4, E2:G4, A5:G5顺序构建:

    /* Initial row */
    var ws = XLSX.utils.json_to_sheet([
      { A: "S", B: "h", C: "e", D: "e", E: "t", F: "J", G: "S" }
    ], {header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true});
    
    /* Write data starting at A2 */
    XLSX.utils.sheet_add_json(ws, [
      { A: 1, B: 2 }, { A: 2, B: 3 }, { A: 3, B: 4 }
    ], {skipHeader: true, origin: "A2"});
    
    /* Write data starting at E2 */
    XLSX.utils.sheet_add_json(ws, [
      { A: 5, B: 6, C: 7 }, { A: 6, B: 7, C: 8 }, { A: 7, B: 8, C: 9 }
    ], {skipHeader: true, origin: { r: 1, c: 4 }, header: [ "A", "B", "C" ]});
    
    /* Append row */
    XLSX.utils.sheet_add_json(ws, [
      { A: 4, B: 5, C: 6, D: 7, E: 8, F: 9, G: 0 }
    ], {header: ["A", "B", "C", "D", "E", "F", "G"], skipHeader: true, origin: -1});
    

    HTML Table 输入

    XLSX.utils.table_to_sheet获取一个table DOM元素,并且返回一个工作表寻找输入的table。Numbers会被解析。所有的数据将会被存储为字符串。

    XLSX.utils.table_to_book基于工作表会产生一个最小的工作簿。

    两个函数接受选项参数:

    Option NameDefaultDescription
    raw如果值为true, 每一个单元格将会保存原始的字符串
    dateNFFMT 14字符串输出使用指定的日期格式
    cellDatesfalse把日期存储为类型 d (默认是 n)
    sheetRows0如果值 >0, 读取表格的第一个sheetRows
    displayfalse如果值为true, 隐藏的行和单元格将不会被解析
    例子 (点击显示)

    生成示例表单,以HTML table开始:

    <table id="sheetjs">
    <tr><td>S</td><td>h</td><td>e</td><td>e</td><td>t</td><td>J</td><td>S</td></tr>
    <tr><td>1</td><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td></tr>
    <tr><td>2</td><td>3</td><td>4</td><td>5</td><td>6</td><td>7</td><td>8</td></tr>
    </table>
    

    处理表格:

    var tbl = document.getElementById('sheetjs');
    var wb = XLSX.utils.table_to_book(tbl);
    

    注意:XLSX.read能够处理表示为字符串的HTML。

    公式输出

    XLSX.utils.sheet_to_formulae生成一个命令数组,命令显示了一个人会怎样进入一个应用。每一个入口都是表格A1-cell-address=formula-or-value。字符串文字以"`"为前缀,符合Excel。

    例子 (点击显示)

    示例表:

    > var o = XLSX.utils.sheet_to_formulae(ws);
    > [o[0], o[5], o[10], o[15], o[20]];
    [ 'A1=\'S', 'F1=\'J', 'D2=4', 'B3=3', 'G3=8' ]
    

    定界分隔符输出

    作为一个writeFile CSV 类型的替代,XLSX.utils.sheet_to_csv也会产生CSV输出。这个函数获取一个选项参数:

    Option NameDefaultDescription
    FS",""字段分隔符"表示字段之间的分隔符
    RS"\n""记录分隔符"表示行之间的分隔符
    dateNFFMT 14字符串输出使用指定的日期格式
    stripfalse删除每条记录中的尾随字段分隔符**
    blankrowstrue包含CSV输出的空白行
    skipHiddenfalse跳过CSV输出的隐藏行/列
    • strip将删除默认FS / RS下每行的尾随逗号
      blankrows必须设置为false才能跳过空白行。
    例子 (点击显示)

    示例表:

    > console.log(XLSX.utils.sheet_to_csv(ws));
    S,h,e,e,t,J,S
    1,2,3,4,5,6,7
    2,3,4,5,6,7,8
    > console.log(XLSX.utils.sheet_to_csv(ws, {FS:"\t"}));
    S	h	e	e	t	J	S
    1	2	3	4	5	6	7
    2	3	4	5	6	7	8
    > console.log(XLSX.utils.sheet_to_csv(ws,{FS:":",RS:"|"}));
    S:h:e:e:t:J:S|1:2:3:4:5:6:7|2:3:4:5:6:7:8|
    

    #### UTF-16 Unicode 文本

    txt输出类型使用tab字符作为字段分隔符。如果codepage可用(包含全部的分发但不是核心),输出将会被编码为CP1200并且BOM会被预置。

    XLSX.utils.sheet_to_txt获取和sheet_to_csv一样的参数。

    HTML 输出

    作为’ writeFile ’ HTML类型的替代,XLSX.utils.sheet_to_html也会生成HTML输出。这个函数接受一个选项参数:

    Option NameDefaultDescription
    idTABLE元素指定 id 特性
    editablefalse如果值为true, 为每一个TD设置 contenteditable="true"
    header覆盖 header (默认 html body)
    footer覆盖 footer (默认 /body /html)
    例子 (点击显示)

    示例表格:

    > console.log(XLSX.utils.sheet_to_html(ws));
    // ...
    

    JSON

    XLSX.utils.sheet_to_json生成不同类型的JS对象。这个函数接受一个选项参数:

    Option NameDefaultDescription
    rawtrue使用原生值 (true) 或者格式化字符串 (false)
    rangefrom WS覆盖 Range (查看下面的table)
    header控制输出格式 (查看下面的table)
    dateNFFMT 14字符串输出使用指定的日期格式
    defval使用指定的值替代null或者undefined
    blankrows**包含输出的空白行 **
    • raw只影响有格式编码(.z)字段或者格式化文本(.w)字段的单元格。
    • 如果header被指定,第一行就会被当做数据行;如果header未指定,第一行是header并且不作为数据。
    • 当header未指定时,转换将通过添加"_"和一个从"1"开始的计数自动消除标题条目的歧义。例如有三列的标题都是foo,那么输出字段是foo1foo_1foo_2
    • raw值为true时返回nullraw值为false会被跳过。
    • 如果defval没有指定,通常nullundefined会被跳过。如果defval有指定值,所有的nullundefined嗲都将会用defval填充。
    • header1时,默认生成空白行。blankrows必须设置为false来跳过空白行。
    • header不为1时,默认跳过空白行。blankrows必须设置为true来生成空白行。

    range是以下之一:

    rangeDescription
    (number)使用工作表范围,但将起始行设置为值
    (string)使用指定的范围 (A1类型的有界范围的字符串)
    (default)使用工作表范围 (ws['!ref'])

    header是以下之一:

    headerDescription
    1生成数组类型的数组 (“二维数组”)
    "A"行对象的键是文字的列标题
    array of strings在行对象内使用指定的字符串作为键
    (default)读取并消除第一行的歧义作为键

    如果header不为1,行对象将会包含不可枚举的属性``rowNum`,这个属性代表与条目相对应的工作表的行。

    示例 (点击显示) 示例表:
    > XLSX.utils.sheet_to_json(ws);
    [ { S: 1, h: 2, e: 3, e_1: 4, t: 5, J: 6, S_1: 7 },
      { S: 2, h: 3, e: 4, e_1: 5, t: 6, J: 7, S_1: 8 } ]
    
    > XLSX.utils.sheet_to_json(ws, {header:"A"});
    [ { A: 'S', B: 'h', C: 'e', D: 'e', E: 't', F: 'J', G: 'S' },
      { A: '1', B: '2', C: '3', D: '4', E: '5', F: '6', G: '7' },
      { A: '2', B: '3', C: '4', D: '5', E: '6', F: '7', G: '8' } ]
    
    > XLSX.utils.sheet_to_json(ws, {header:["A","E","I","O","U","6","9"]});
    [ { '6': 'J', '9': 'S', A: 'S', E: 'h', I: 'e', O: 'e', U: 't' },
      { '6': '6', '9': '7', A: '1', E: '2', I: '3', O: '4', U: '5' },
      { '6': '7', '9': '8', A: '2', E: '3', I: '4', O: '5', U: '6' } ]
    
    > XLSX.utils.sheet_to_json(ws, {header:1});
    [ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
      [ '1', '2', '3', '4', '5', '6', '7' ],
      [ '2', '3', '4', '5', '6', '7', '8' ] ]
    

    展示row效果的例子:

    > ws['A2'].w = "3";                          // set A2 formatted string value
    
    > XLSX.utils.sheet_to_json(ws, {header:1, raw:false});
    [ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
      [ '3', '2', '3', '4', '5', '6', '7' ],     // <-- A2 uses the formatted string
      [ '2', '3', '4', '5', '6', '7', '8' ] ]
    
    > XLSX.utils.sheet_to_json(ws, {header:1});
    [ [ 'S', 'h', 'e', 'e', 't', 'J', 'S' ],
      [ 1, 2, 3, 4, 5, 6, 7 ],                   // <-- A2 uses the raw value
      [ 2, 3, 4, 5, 6, 7, 8 ] ]
    

    文件格式

    虽然库的名称是xlsx,不过它支持多种电子表格文件格式:

    FormatReadWrite
    Excel Worksheet/Workbook Formats:-----::-----:
    Excel 2007+ XML Formats (XLSX/XLSM)⭕️⭕️
    Excel 2007+ Binary Format (XLSB BIFF12)⭕️⭕️
    Excel 2003-2004 XML Format (XML “SpreadsheetML”)⭕️⭕️
    Excel 97-2004 (XLS BIFF8)⭕️⭕️
    Excel 5.0/95 (XLS BIFF5)⭕️⭕️
    Excel 4.0 (XLS/XLW BIFF4)⭕️
    Excel 3.0 (XLS BIFF3)⭕️
    Excel 2.0/2.1 (XLS BIFF2)⭕️⭕️
    Excel支持的文本格式:-----::-----:
    Delimiter-Separated Values(定界分隔符的值 ) (CSV/TXT)⭕️⭕️
    Data Interchange Format(数据交换格式 (DIF)⭕️⭕️
    Symbolic Link(符号链接) (SYLK/SLK)⭕️⭕️
    Lotus Formatted Text(lotus格式的文本) (PRN)⭕️⭕️
    UTF-16 Unicode Text (TXT)⭕️⭕️
    其他工作簿/工作表格式:-----::-----:
    OpenDocument Spreadsheet(开放文档格式的电子表格) (ODS)⭕️⭕️
    Flat XML ODF Spreadsheet (FODS)⭕️⭕️
    Uniform Office Format Spreadsheet (标文通 UOS1/UOS2)⭕️
    dBASE II/III/IV / Visual FoxPro (DBF)⭕️⭕️
    Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)⭕️
    Quattro Pro Spreadsheet (WQ1/WQ2/WB1/WB2/WB3/QPW)⭕️
    其他常用的电子表格输出格式:-----::-----:
    HTML Tables⭕️⭕️
    Rich Text Format tables(富文本格式表) (RTF)⭕️
    Ethercalc Record Format(Ethercalc记录格式) (ETH)⭕️⭕️

    不会写入给定文件格式不支持的功能。具有范围限制的格式将会被静默截断:

    FormatLast CellMax ColsMax Rows
    Excel 2007+ XML Formats (XLSX/XLSM)XFD1048576163841048576
    Excel 2007+ Binary Format (XLSB BIFF12)XFD1048576163841048576
    Excel 97-2004 (XLS BIFF8)IV6553625665536
    Excel 5.0/95 (XLS BIFF5)IV1638425616384
    Excel 2.0/2.1 (XLS BIFF2)IV1638425616384

    Excel 2003 电子表格的范围限制被Excel的版本控制,并且不会写入函数强制执行。

    Excel 2007+ XML (XLSX/XLSM)

    (点击显示)

    XlSX和XLSM文件是ZIP容器包含的与开源打包约定(Open Packaging Conventions, OPC)一致的一系列文件。大多数XLSM格式与XLSX相同,被用作文件包含宏命令。

    这个格式在ECMA-376以及随后的ISO/IEC 29500都进行了标准化。Excel没有加遵循这个规范,并且还有其他文件讨论Excel如何偏离规范。

    Excel 2.0-95 (BIFF2/BIFF3/BIFF4/BIFF5)

    (点击显示)

    BIFF 2/3 XLS是二进制记录的单表流。Excel 4介绍了工作簿的原理,除了有单表的XLS格式。结构与Lotus 1-2-3文件格式非常相似。BIFF5/8/12用了多种方式扩展格式,不过很大程度上保持了相同的记录格式。

    对于这些格式没有官方的规范。Excel 95在这些格式里面可以写入文件,因此记录的长度以及字段都是由所有支持的格式以及比较文件决定。Excel 2016可以生成BIFF5文件,从XLSX或BIFF2开始启用全套文件测试。

    Excel 97-2004 Binary (BIFF8)

    (点击显示)

    BIFF8仅仅使用混合的文件二进制容器格式,将一些内容放在文件的流内。在它的核心,它将会使用来自BIFF的老版本的二进制记录格式的扩展版本。

    MS-XLS规范覆盖了文件格式的基础,并且其他的规范扩展了属性(如特性)的规范化。

    Excel 2003-2004 (SpreadsheetML)

    (点击显示)

    在XLSX之前,SpreadsheetML文件是简单的XML文件。没有官方的并且全面的的规范,虽然MS对于这种格式有发布的文档。因此Excel 2016 生成了电子表格文件,映射功能非常简单。

    Excel 2007+ Binary (XLSB, BIFF12)

    (点击显示)

    XLSB格式与XLSX并行引入,将BIFF架构与内容分离和XLSX的ZIP容器相结合。XLSX子文件的大部分节点能用一个相应的子文件映射到XLSB记录中去。

    MS-XLSB规范包含了文件格式的基础,并且其他的规范扩展了属性(如特性)的序列化。

    定界分隔符的值 (CSV/TXT)

    (点击显示)

    Excel CSV在许多重要的方法上背离了RFC4180。生成的CSV文件通常应该运行在Excel内,但是他们不能运行RFC4180兼容的读取器中。解析器通常理解Excel CSV。如果值不可用,写入器会为公式主动生成单元格。

    Excel TXT 使用tab作为分隔符,编码页1200。

    注意:

    • 像在Excel中,以0x49 0x44 ("ID")开始的文件会被当做是符号链接(Symbolic Link)文件。不像Excel,如果文件没有一个有效的SYLK标题,他将会被主动解释为SYLK文件。为了广泛的兼容性,所有值为ID的单元格会自动用双引号包裹。

    其他工作簿格式

    (点击显示) 对其他格式的支持通常远远超出XLS / XLSB / XLSX支持,这在很大程度上是由于缺乏公开可用的文档。文件通常是在各自的应用内产生,并且会与他们的导出文件相比较以确定结构。主要的关注点是数据提出。

    Lotus 1-2-3 (WKS/WK1/WK2/WK3/WK4/123)

    (点击显示)

    Lotus格式由与BIFF结构相似的二进制记录组成。Lotus几十年前发布了一份包含原始WK1格式的规范。通过生成文件和与Excel支持进行比较来推断其他功能。

    Quattro Pro (WQ1/WQ2/WB1/WB2/WB3/QPW)

    (点击显示)

    Quattro Pro格式使用与BIFF和Lotus一样的二进制记录。一些较新的格式(命名为WB3 和 QPW)使用像BIFF8 XLS一样的CFB附件。

    OpenDocument Spreadsheet(开放文档格式的电子表格) (ODS/FODS)

    (点击显示)

    ODS是一种类似于XLSX的XML-in-ZIP格式,而FODS是一种类似于SpreadsheetML的XML格式。两种格式都在OASIS标准中进行了详细的说明,不过像LO/OO工具被添加到了未公开的扩展中。解析器和编写器并没有实现全部的标准,反而重点实现了提取和存储行数据中重要的部分。

    Uniform Office Spreadsheet(统一办公电子表格) (UOS1/2)

    (点击显示)

    UOS是一种非常相似的格式,并且它有2个变种,分别对应ODS和FODS。大多数情况下,格式之间的区别是标签和属性的名称。

    Other Single-Worksheet Formats(其他单一工作表格式)

    大多数较老的浏览器仅支持一种工作表:

    dBASE and Visual FoxPro (DBF)

    (点击显示)

    DBF实际上是一种类型化的表格格式:每一列只能保存一种数据类型,并且每条记录忽略类型信息。解析器生成标题行并且在工作表的第二行开始插入记录。编写器让文件和Visual FoxPro兼容。

    多文件的扩展,比如内部示例和表格,目前不支持,会被在web浏览器中读取任意文件的普通能力所限制。读取器理解DBF level 7的扩展,比如DATETIME。

    Symbolic Link(符号链接) (SYLK)

    (点击显示) 没有真正的文档。通过各种版本的Excel中保存文件来收集所有知识,以推断出字段的含义。注意:
    • 简单的公式被存储在RC表单中。
    • 列宽会被四舍五入成完整的字符。

    Lotus Formatted Text (PRN)

    (点击显示) 没有真正的文档。事实上Excel把PRN视为一种只能输出的文件格式。然而我们能够猜测列宽并且反向还原原始布局。Excel 240个字符宽度的限制不会被强制执行。

    Data Interchange Format(数据交换格式) (DIF)

    (点击显示)

    没有统一标准的定义。 Visicalc DIF与Lotus DIF不同,并且两者都与Excel DIF不一样。在不明确的情况下,解析器/编写器遵循Excel中的预期行为。特别地,Excel以不兼容的方式扩展DIF:

    • 由于Excel自动将数字字符串转换为数字,数字的字符串常量被转换成公式:"0.3" -> "=""0.3""
    • DIF技术上期待数字的单元格保存原始的数字数据,不过Excel允许格式化数字(包括日期)。
    • DIF技术上不支持公式,但是Excel将会转换简单公式。数组公式没有保存。

    HTML

    (点击显示) Excel HTML工作表包含以样式编码的特殊元数据。例如`mso-number-format`是一个包含数字格式的本地化字符串。尽管元数据的输出是有效的HTML,但是他不接受空的`&`符号。

    编写器通过t标签添加类型元数据到TD元素中去。解析器检查这些标签,并且覆盖默认的解释。例如文本<td>12345</td>将会被解析成数字,不过<td t="s">12345</td>将会被解析成文本。

    Rich Text Format(富文本格式) (RTF)

    (点击显示)

    当复制工作表内的单元格或者范围时,Excel RTF工作表会被存储在剪贴板内。支持的编码是单词RTF支持的一个子集。

    Ethercalc Record Format (ETH)

    (点击显示)

    Ethercalc是一种开源的web电子表格,由记录格式驱动,让人联想到包含在MIME多部分消息中的SYLK。

    测试

    Node

    (点击显示) `make test`将会运行node基础的测试。默认情况下,它以各种支持的格式对文件运行测试。要测试一种指定的文件类型,设置`FMTS`为你想要测试的类型。使用`make test_misc`可以获得指定功能的测试。
    $ make test_misc   # run core tests
    $ make test        # run full tests
    $ make test_xls    # only use the XLS test files
    $ make test_xlsx   # only use the XLSX test files
    $ make test_xlsb   # only use the XLSB test files
    $ make test_xml    # only use the XML test files
    $ make test_ods    # only use the ODS test files
    

    要想启用所有的错误,请设置环境变量WTF=1

    $ make test        # run full tests
    $ WTF=1 make test  # enable all error messages
    

    flow and eslint checks are available:

    $ make lint        # eslint checks
    $ make flow        # make lint + Flow checking
    $ make tslint      # check TS definitions
    

    浏览器

    (点击显示) 核心浏览器内测试可在此repo中的`tests/index.html`中找到。启动一个本地服务器并且导航到那个目录去运行测试。`make ctestserv`将会在8080端口启动一个服务。

    make ctest将生成浏览器装置。要添加更多的文件,编辑tests/fixtures.lst并且添加路径。

    要运行完整的浏览器内测试,从oss.sheetjs.com克隆这个repo,并且替换xlsx.js文件(然后打开一个浏览器窗口跳转到stress.html)。

    $ cp xlsx.js ../SheetJS.github.io
    $ cd ../SheetJS.github.io
    $ simplehttpserver # or "python -mSimpleHTTPServer" or "serve"
    $ open -a Chromium.app http://localhost:8000/stress.html
    

    测试环境

    (点击显示)
    • NodeJS 0.8, 0.10, 0.12, 4.x, 5.x, 6.x, 7.x, 8.x
    • IE 6/7/8/9/10/11 (IE 6-9 require shims)
    • Chrome 24+ (including Android 4.0+)
    • Safari 6+ (iOS and Desktop)
    • Edge 13+, FF 18+, and Opera 12+

    测试使用mocha测试框架。Travis-CI 和 Sauce Labs 链接:

    Travis-CI测试组合也包括用于多种时区的测试。改变本地的时区,设置TZ环境可用:

    $ env TZ="Asia/Kolkata" WTF=1 make test_misc
    

    测试文件

    测试文件被封装在另一个仓库

    运行make init将会刷新test_files子模块并获取子模块的文件。注意这个可能需要svn, git, hg以及其它可能不可用的命令。如果make init失败,请从仓库下载测试文件快照的最新版本。

    最新快照 (点击显示) 最新的测试文件快照:

    (下载并解压到test_files子目录)

    贡献

    由于开放规范承诺的不稳定性,确保代码是洁净室非常重要。贡献记录

    文件组织 (点击显示) 在最高级别,最终脚本是`bits`文件夹中各个文件的串联。运行`make`应该在所有平台上重现最终输出。同样,README被分成了`docbits`文件夹中的位。

    文件夹:

    foldercontents
    bits组成最终脚本的原生源文件
    docbits组成README.md的原生markdown文件
    bin服务器端bin脚本 (xlsx.njs)
    dist用于Web浏览器和非标准JS环境的dist文件
    demos针对ExtendScript和Webpack等平台的演示项目
    tests浏览器测试 (运行 make ctest 进行构建)
    typestypescript定义和测试
    misc各种各样的支持脚本
    test_files测试文件 (从测试文件仓库拉取)

    克隆仓库之后,运行make help将会显示一个命令列表。

    OSX/Linux

    (点击显示)

    xlsx.js文件由来自于bits子目录的文件构建。构建脚本(运行make)将会连接各个位来产生脚本。提交一个贡献之前,确保运行将会准确地产生xlsx.js文件。测试的最简单方式就是添加下面的脚本:

    $ git add xlsx.js
    $ make clean
    $ make
    $ git diff xlsx.js
    

    运行make dist产生dist文件。每一个版本中的dist文件都会被更新,并且不应该在版本之间提交

    Windows

    (点击显示)

    包含make.cmd的脚本将会从bits目录中构建xlsx.js。构建很简单:

    > make
    

    准备开发环境:

    > make init
    

    windows中可用命令的完整列表显示在make help中:

    make init -- 安装依赖和全局模块
    make lint -- 运行 eslint linter
    make test -- 运行mocha测试组合
    make misc -- 运行更小的测试组合
    make book -- 重新构建README 和 summary
    make help -- 显示命令信息
    

    测试文件中解释的一样,在windows中发布ZIP文件必须要下载和提取。如果Bash在windows内可用,可能会运行 OSX/Linux工作流。下面额步骤准备环境:

    # Install support programs for the build and test commands
    sudo apt-get install make git subversion mercurial
    
    # Install nodejs and NPM within the WSL
    wget -qO- https://deb.nodesource.com/setup_8.x | sudo bash
    sudo apt-get install nodejs
    
    # Install dev dependencies
    sudo npm install -g mocha voc blanket xlsjs
    

    测试

    (点击显示) `test_misc`(Linux/OSX用`make test_misc`/windows用`make misc`)目标运行定向的功能测试。执行功能测试需要5-10秒而无需对整个测试电池进行测试。新功能应附带相关文件格式和功能的测试。

    对于涉及读取端的测试,一个合适的功能测试会包括读取一个存在的文件并且检查工作簿对象的结果。如果涉及参数,文件应该读取不同的值以确保功能如预期所料工作。

    对于涉及已经可以解析的新写入功能的测试,恰当的功能测试包括用这个功能写入工作簿,在之后打开并确认功能已经被保存。

    对于涉及没有现有读取能力的新写入功能的测试,请添加功能测试到kitchen sinktests/write.js

    证书

    更多细节请查阅相关的证书。原始作者保留未由Apache 2.0许可证明确授予的所有权利。

    引用

    OSP覆盖的规格(OSP-covered Specifications) (点击显示)
    • MS-CFB: 复合文件二进制文件格式(Compound File Binary File Format)
    • MS-CTXLS: Excel自定义工具栏二进制文件格式(Excel Custom Toolbar Binary File Format)
    • MS-EXSPXML3: Excel计算版本2 Web服务XML架构(Excel Calculation Version 2 Web Service XML Schema)
    • MS-ODATA: 开源的数据协议(Open Data Protocol) (OData)
    • MS-ODRAW: office绘图二进制文件格式(Office Drawing Binary File Format)
    • MS-ODRAWXML: Office开源XML结构的Office绘图扩展(Office Drawing Extensions to Office Open XML Structure)
    • MS-OE376: Office对ECMA-376标准支持的执行信息(Office Implementation Information for ECMA-376 Standards Support)
    • MS-OFFCRYPTO: Office文档密码学结构(Office Document Cryptography Structure)
    • MS-OI29500: Office对ISO/IEC 29500标准支持的执行信息(Office Implementation Information for ISO/IEC 29500 Standards Support)
    • MS-OLEDS: 对象链接和嵌入数据结构(Object Linking and Embedding (OLE) Data Structures)
    • MS-OLEPS: 对象链接和嵌入属性设置数据结构(Object Linking and Embedding (OLE) Property Set Data Structures)
    • MS-OODF3: Office对ODF 1.2标准支持的执行信息(Office Implementation Information for ODF 1.2 Standards Support)
    • MS-OSHARED: Office常用数据类型和对象结构(Office Common Data Types and Objects Structures)
    • MS-OVBA: Office VBA文件结构(Office VBA File Format Structure)
    • MS-XLDM: 电子表格数据模型文件格式(Spreadsheet Data Model File Format)
    • MS-XLS: Excel二进制文件格式(.xls)结构规范(Excel Binary File Format (.xls) Structure Specification)
    • MS-XLSB: Excel (.xlsb)二进制文件格式(Excel (.xlsb) Binary File Format)
    • MS-XLSX: Excel (.xlsx) Extensions to the Office Open XML SpreadsheetML File Format
    • XLS: Microsoft Office Excel 97-2007 Binary File Format Specification
    • RTF: 富文本(Rich Text Format)
    • ISO/IEC 29500:2012(E) “信息技术 - 文档描述和处理语言 - Office开源XML文件格式”
    • Office应用版本 1.2(2011/9/29)开源文档格式
    • 工作表文件格式(来自于Lotus) 1984年12月
    展开全文
  • package.json文件,配置了一个脚本,该脚本会自动在浏览器打开一个新选项卡。 随时更改此说明 运行npm start 代码脚手架 运行ng generate component component-name生成一个新的组件。 您还可以使用ng ...
  • ffmpeg中文文档

    千次阅读 2019-06-13 19:13:35
    1简介 ffmpeg [global_options] {[input_...ffmpeg是一个非常快速的视频和音频转换器,也可以从现场音频/视频源获取。它还可以任意采样率之间进行转换,并使用高质量的多相滤波器动态调整视频大小。 ffmpeg从-...

    1简介

    ffmpeg [global_options] {[input_file_options] -i input_url} ... {[output_file_options] output_url} ...

    2描述
    ffmpeg是一个非常快速的视频和音频转换器,也可以从现场音频/视频源中获取。它还可以在任意采样率之间进行转换,并使用高质量的多相滤波器动态调整视频大小。

    ffmpeg从-i选项指定的任意数量的输入“文件”(可以是常规文件,管道,网络流,抓取设备等)读取,并写入任意数量的输出“文件”,由普通输出URL指定。命令行中找不到的任何无法解释为选项的内容都被视为输出URL。

    原则上,每个输入或输出URL可以包含任何数量的不同类型的流(视频/音频/字幕/附件/数据)。允许的流的数量和/或类型可以受容器格式的限制。选择哪些输入将通过哪些输入自动完成或使用-map选项进行输出(请参阅流选择章节)。

    要在选项中引用输入文件,必须使用它们的索引(从0开始)。例如。第一个输入文件是0,第二个是1,等等。类似地,文件中的流由它们的索引引用。例如。 2:3指的是第三个输入文件中的第四个流。另请参阅Stream说明符章节。

    作为一般规则,选项将应用于下一个指定的文件。因此,顺序很重要,您可以在命令行上多次使用相同的选项。然后将每次出现应用于下一个输入或输出文件。此规则的例外是全局选项(例如详细级别),应首先指定。

    不要混合输入和输出文件 - 首先指定所有输入文件,然后指定所有输出文件。也不要混合属于不同文件的选项。所有选项仅适用于下一个输入或输出文件,并在文件之间重置。

    要将输出文件的视频比特率设置为64 kbit / s:

    ffmpeg -i input.avi -b:v 64k -bufsize 64k output.avi

    要强制输出文件的帧速率为24 fps:

    ffmpeg -i input.avi -r 24 output.avi

    要强制输入文件的帧速率(仅对原始格式有效)为1 fps,输出文件的帧速率为24 fps:

    ffmpeg -r 1 -i input.m2v -r 24 output.avi

    原始输入文件可能需要format选项。

    3详细说明

    ffmpeg中每个输出的转码过程可以通过下图描述:

     _______              ______________
    |       |            |              |
    | input |  demuxer   | encoded data |   decoder
    | file  | ---------> | packets      | -----+
    |_______|            |______________|      |
                                               v
                                           _________
                                          |         |
                                          | decoded |
                                          | frames  |
                                          |_________|
     ________             ______________       |
    |        |           |              |      |
    | output | <-------- | encoded data | <----+
    | file   |   muxer   | packets      |   encoder
    |________|           |______________|
    

    ffmpeg调用libavformat库(包含解复用器)来读取输入文件并从中获取包含编码数据的数据包。 当有多个输入文件时,ffmpeg会尝试通过跟踪任何活动输入流上的最低时间戳来保持它们的同步。

    然后将编码的数据包传递给解码器(除非为流选择了流复制,进一步参见说明)。 解码器产生未压缩的帧(原始视频/ PCM音频/ ...),可以通过过滤进一步处理(参见下一节)。 在过滤之后,帧被传递到编码器,编码器对它们进行编码并输出编码的分组。 最后将这些传递给复用器,复用器将编码的数据包写入输出文件。

    3.1过滤
    在编码之前,ffmpeg可以使用libavfilter库中的过滤器处理原始音频和视频帧。 几个链式过滤器形成过滤器图形。 ffmpeg区分两种类型的filtergraph:简单和复杂。

    3.1.1简单滤波器图
    简单的过滤器图是那些只有一个输入和输出的过滤器图,它们都是相同的类型。 在上图中,只需在解码和编码之间插入一个额外的步骤即可表示它们:

     _________                        ______________
    |         |                      |              |
    | decoded |                      | encoded data |
    | frames  |\                   _ | packets      |
    |_________| \                  /||______________|
                 \   __________   /
      simple     _\||          | /  encoder
      filtergraph   | filtered |/
                    | frames   |
                    |__________|

    简单的过滤器图使用per-stream -filter选项配置(分别使用-vf和-af别名用于视频和音频)。 一个简单的视频过滤器图可以看起来像这样:

     _______        _____________        _______        ________
    |       |      |             |      |       |      |        |
    | input | ---> | deinterlace | ---> | scale | ---> | output |
    |_______|      |_____________|      |_______|      |________|

    请注意,某些过滤器会更改帧属性但不会更改帧内容。 例如。 上例中的fps过滤器会更改帧数,但不会触及帧内容。 另一个例子是setpts过滤器,它只设置时间戳,否则不改变帧。

    3.1.2复杂滤波器图
    复杂滤波器图是那些不能简单地描述为应用于一个流的线性处理链的图。 例如,当图形具有多个输入和/或输出,或者输出流类型与输入不同时,就是这种情况。 它们可以用下图表示:

     _________
    |         |
    | input 0 |\                    __________
    |_________| \                  |          |
                 \   _________    /| output 0 |
                  \ |         |  / |__________|
     _________     \| complex | /
    |         |     |         |/
    | input 1 |---->| filter  |\
    |_________|     |         | \   __________
                   /| graph   |  \ |          |
                  / |         |   \| output 1 |
     _________   /  |_________|    |__________|
    |         | /
    | input 2 |/
    |_________|

    复杂滤波器图使用-filter_complex选项配置。 请注意,此选项是全局的,因为复杂的过滤器图本质上不能明确地与单个流或文件关联。

    -lavfi选项相当于-filter_complex。

    复杂滤波器图的一个简单示例是覆盖滤波器,它具有两个视频输入和一个视频输出,其中一个视频覆盖在另一个之上。 它的音频对应物是amix过滤器。

    3.2流复制
    流复制是通过将复制参数提供给-codec选项而选择的模式。 它使ffmpeg省略了指定流的解码和编码步骤,因此它只进行解复用和多路复用。 它对于更改容器格式或修改容器级元数据很有用。 在这种情况下,上图将简化为:

     _______              ______________            ________
    |       |            |              |          |        |
    | input |  demuxer   | encoded data |  muxer   | output |
    | file  | ---------> | packets      | -------> | file   |
    |_______|            |______________|          |________|
    

    由于没有解码或编码,因此速度非常快,并且没有质量损失。但是,由于许多因素,它可能在某些情况下不起作用。应用过滤器显然也是不可能的,因为过滤器可以处理未压缩的数据。

    4流选择
    ffmpeg提供-map选项,用于手动控制每个输出文件中的流选择。用户可以跳过-map并让ffmpeg执行自动流选择,如下所述。 -vn / -an / -sn / -dn选项可用于分别跳过包含视频,音频,字幕和数据流,无论是手动映射还是自动选择,除了作为复杂滤波器图形输出的那些流。

    4.1描述
    以下子部分描述了流选择中涉及的各种规则。接下来的示例显示了这些规则在实践中的应用方式。

    虽然我们尽一切努力准确地反映程序的行为,但FFmpeg正在不断发展,自撰写本文之后,代码可能已经发生了变化。

    4.1.1自动选择流
    在没有特定输出文件的任何映射选项的情况下,ffmpeg检查输出格式以检查可以包含哪种类型的流,即。视频,音频和/或字幕。对于每个可接受的流类型,ffmpeg将从所有输入中选择一个流(如果可用)。

    它将根据以下标准选择该流:

    对于视频,它是具有最高分辨率的流,
    对于音频,它是具有最多频道的流,
    对于字幕,它是第一个找到的字幕流,但有一个警告。输出格式的默认字幕编码器可以是基于文本的,也可以是基于图像的,并且仅选择相同类型的字幕流。
    在几个相同类型的流速率相等的情况下,选择具有最低索引的流。

    数据或附件流不会自动选择,只能使用-map包含在内。

    4.1.2手动流选择
    使用-map时,只有用户映射的流包含在该输出文件中,下面描述了filtergraph输出的一个可能的例外。

    4.1.3复杂滤波器图
    如果有任何带有未标记焊盘的复杂滤波器输出流,它们将被添加到第一个输出文件中。如果输出格式不支持流类型,则会导致致命错误。如果没有map选项,则包含这些流会导致跳过其类型的自动流选择。如果存在地图选项,则除了映射的流之外还包括这些滤波器流。

    带有标记焊盘的复杂滤波器输出流必须一次映射一次。

    4.1.4流处理
    流处理与流选择无关,下面描述的字幕除外。流处理通过-codec选项设置,该选项针对特定输出文件中的流。特别是,在流选择过程之后,ffmpeg应用编解码器选项,因此不影响后者。如果没有为流类型指定-codec选项,ffmpeg将选择输出文件muxer注册的默认编码器。

    字幕存在例外。如果为输出文件指定了字幕编码器,则将包括找到任何类型,文本或图像的第一个字幕流。 ffmpeg不验证指定的编码器是否可以转换所选的流,或者转换的流是否在输出格式中是可接受的。这通常也适用:当用户手动设置编码器时,流选择过程不能检查编码流是否可以复用到输出文件中。如果不能,则ffmpeg将中止,并且所有输出文件都将无法处理。

    4.2例子
    以下示例说明了ffmpeg的流选择方法的行为,怪癖和限制。

    他们假设以下三个输入文件。

    input file 'A.avi'
          stream 0: video 640x360
          stream 1: audio 2 channels
    
    input file 'B.mp4'
          stream 0: video 1920x1080
          stream 1: audio 2 channels
          stream 2: subtitles (text)
          stream 3: audio 5.1 channels
          stream 4: subtitles (text)
    
    input file 'C.mkv'
          stream 0: video 1280x720
          stream 1: audio 2 channels
          stream 2: subtitles (image)

    示例:自动流选择

    ffmpeg -i A.avi -i B.mp4 out1.mkv out2.wav -map 1:a -c:a copy out3.mov

    指定了三个输出文件,对于前两个,未设置-map选项,因此ffm​​peg将自动为这两个文件选择流。

    out1.mkv是一个Matroska容器文件,接受视频,音频和字幕流,因此ffm​​peg将尝试选择每种类型中的一种。
    对于视频,它将从B.mp4中选择stream 0,其在所有输入视频流中具有最高分辨率。
    对于音频,它将从B.mp4中选择流stream 3,因为它具有最多的通道。
    对于字幕,它将从B.mp4中选择流stream 2,这是A.avi和B.mp4中的第一个字幕流。

    out2.wav只接受音频流,因此只选择来自B.mp4的stream 3。

    对于out3.mov,由于设置了-map选项,因此不会进行自动流选择。 -map 1:一个选项将从第二个输入B.mp4中选择所有音频流。此输出文件中不包含其他流。

    对于前两个输出,将对所有包含的流进行转码。选择的编码器将是每种输出格式注册的默认编码器,可能与所选输入流的编解码器不匹配。

    对于第三个输出,音频流的编解码器选项已设置为复制,因此不会发生或可能发生解码 - 过滤 - 编码操作。所选流的数据包应从输入文件传送,并在输出文件中复用。

    示例:自动字幕选择

    ffmpeg -i C.mkv out1.mkv -c:s dvdsub -an out2.mkv

    尽管out1.mkv是Matroska容器文件,它接受字幕流,但只能选择视频和音频流。 C.mkv的字幕流是基于图像的,并且Matroska复用器的默认字幕编码器是基于文本的,因此字幕的转码操作预计会失败,因此不选择该流。 然而,在out2.mkv中,在命令中指定字幕编码器,因此,除了视频流之外,还选择字幕流。 -an的存在禁用out2.mkv的音频流选择。

    示例:未标记的滤波器图输出

    ffmpeg -i A.avi -i C.mkv -i B.mp4 -filter_complex "overlay" out1.mp4 out2.srt

    此处使用-filter_complex选项设置过滤器图,该过滤器图由单个视频过滤器组成。 叠加滤波器只需要两个视频输入,但没有指定,因此使用前两个可用视频流,即A.avi和C.mkv。 过滤器的输出板没有标签,因此被发送到第一个输出文件out1.mp4。 因此,跳过自动选择视频流,这将选择B.mp4中的流。 大多数频道的音频流即。 自动选择B.mp4中的流3。 然而,没有选择字幕流,因为MP4格式没有注册默认字幕编码器,并且用户没有指定字幕编码器。

    第二个输出文件out2.srt仅接受基于文本的字幕流。 因此,即使可用的第一个字幕流属于C.mkv,它也是基于图像的,因此被跳过。 所选择的流,B.mp4中的流2,是第一个基于文本的字幕流。

    示例:标记的filtergraph输出

    ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
           -map '[outv]' -an        out1.mp4 \
                                    out2.mkv \
           -map '[outv]' -map 1:a:0 out3.mkv

    上面的命令将失败,因为标记为[outv]的输出焊盘已被映射两次。 不应处理任何输出文件。

    ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0[outv];overlay;aresample" \
           -an        out1.mp4 \
                      out2.mkv \
           -map 1:a:0 out3.mkv

    上面的命令也会失败,因为色调过滤器输出有一个标签[out],并且没有被映射到任何地方。
    该命令应修改如下,

    ffmpeg -i A.avi -i B.mp4 -i C.mkv -filter_complex "[1:v]hue=s=0,split=2[outv1][outv2];overlay;aresample" \
            -map '[outv1]' -an        out1.mp4 \
                                      out2.mkv \
            -map '[outv2]' -map 1:a:0 out3.mkv

    来自B.mp4的视频流被发送到色调过滤器,其输出使用分割滤波器克隆一次,并且两个输出都标记为。然后将每个副本映射到第一个和第三个输出文件。

    需要两个视频输入的覆盖滤波器使用前两个未使用的视频流。这些是来自A.avi和C.mkv的流。叠加输出未标记,因此无论是否存在-map选项,它都会被发送到第一个输出文件out1.mp4。

    aresample过滤器发送第一个未使用的音频流,即A.avi的音频流。由于此过滤器输出也未标记,因此它也映射到第一个输出文件。 -an的存在仅抑制音频流的自动或手动流选择,而不抑制从滤波器图发送的输出。这两个映射流都应在out1.mp4中的映射流之前进行排序。

    映射到out2.mkv的视频,音频和字幕流完全由自动流选择确定。

    out3.mkv包含来自色调过滤器的克隆视频输出和来自B.mp4的第一个音频流。

    5选项
    如果没有另外指定,所有数字选项接受表示数字作为输入的字符串,其后可以跟随SI单位前缀之一,例如:'K','M'或'G'。

    如果将“i”附加到SI单位前缀,则完整前缀将被解释为二进制倍数的单位前缀,其基于1024的幂而不是1000的幂。将“B”附加到SI单位前缀乘以这允许使用例如:'KB','MiB','G'和'B'作为数字后缀。

    不带参数的选项是布尔选项,并将相应的值设置为true。可以通过在选项名称前加上“no”来将它们设置为false。例如,使用“-nofoo”将名称为“foo”的布尔选项设置为false。

    5.1流说明符
    每个流应用一些选项,例如比特率或编解码器。流指定符用于精确指定给定选项所属的流。

    流说明符是通常附加到选项名称并通过冒号与其分隔的字符串。例如。 -codec:a:1 ac3包含a:1流说明符,匹配第二个音频流。因此,它将为第二音频流选择ac3编解码器。

    流说明符可以匹配多个流,以便将选项应用于所有流。例如。 -b:a 128k匹配所有音频流。

    空流说明符匹配所有流。例如,-codec copy或-codec: copy将复制所有流而无需重新编码。

    流说明符的可能形式是:

    stream_index
    使用此索引匹配流。例如。 -threads:1 4将第二个流的线程数设置为4.如果stream_index用作附加流说明符(见下文),则它从匹配流中选择流编号stream_index。流编号基于libavformat检测到的流的顺序,除非还指定了程序ID。在这种情况下,它基于程序中流的排序。

    stream_type[:additional_stream_specifier]
    stream_type是以下之一:视频为“v”或“V”,音频为“a”,副标题为“s”,数据为“d”,附件为“t”。 'v'匹配所有视频流,'V'仅匹配未附加图片,视频缩略图或封面艺术的视频流。如果使用additional_stream_specifier,则它匹配具有此类型并与additional_stream_specifier匹配的流。否则,它匹配指定类型的所有流。

    p:program_id[:additional_stream_specifier]
    使用id program_id匹配程序中的流。如果使用additional_stream_specifier,则它匹配两个都是程序一部分并与additional_stream_specifier匹配的流。

    #stream_id or i:stream_id
    通过流id匹配流(例如,MPEG-TS容器中的PID)。

    m:key[:value]
    使用具有指定值的元数据标记键匹配流。如果未给出value,则将包含给定标记的流与任何值匹配。

    u
    匹配具有可用配置的流,必须定义编解码器并且必须存在诸如视频维度或音频采样率之类的基本信息。

    请注意,在ffmpeg中,按元数据匹配仅适用于输入文件。

    5.2通用选项
    这些选项在ff *工具中共享。

    -L
    显示许可证。

    -h, - ?, -  help, -  help [arg]
    显示帮助。可以指定可选参数以打印关于特定项目的帮助。如果未指定参数,则仅显示基本(非高级)工具选项。

    arg的可能值是:


    除基本工具选项外,还可以打印高级工具选项。

    充分
    打印完整的选项列表,包括编码器,解码器,分路器,复用器,滤波器等的共享和专用选项。

    解码器= decoder_name
    打印有关名为decoder_name的解码器的详细信息。使用-decoders选项获取所有解码器的列表。

    编码器= encoder_name
    打印有关名为encoder_name的编码器的详细信息。使用-encoders选项获取所有编码器的列表。

    分路= demuxer_name
    打印有关名为demuxer_name的分路器的详细信息。使用-formats选项获取所有解复用器和复用器的列表。

    复用器= muxer_name
    打印有关名为muxer_name的muxer的详细信息。使用-formats选项获取所有复用器和分路器的列表。

    滤波器= FILTER_NAME
    打印有关过滤器名称filter_name的详细信息。使用-filters选项获取所有过滤器的列表。

    -版
    显示版本。

     - 格式
    显示可用格式(包括设备)。

    -demuxers
    显示可用的解复用器。

    -muxers
    显示可用的复用器。

    -设备
    显示可用设备。

    -codecs
    显示libavcodec已知的所有编解码器。

    请注意,本文档中使用术语“编解码器”作为更正确称为媒体比特流格式的快捷方式。

    -decoders
    显示可用的解码器。

    -encoders
    显示所有可用的编码器。

    -bsfs
    显示可用的比特流过滤器。

    -protocols
    显示可用协议。

    -filters
    显示可用的libavfilter过滤器。

    -pix_fmts
    显示可用的像素格式。

    -sample_fmts
    显示可用的样本格式。

    -layouts
    显示频道名称和标准频道布局。

    -colors
    显示已识别的颜色名称

    -sources device [,opt1 = val1 [,opt2 = val2] ...]
    显示输入设备的自动检测源。某些设备可能提供无法自动检测的系统相关源名称。不能假定返回的列表总是完整的。

    ffmpeg -sources pulse,server=192.168.0.4

    -sinks device [,opt1 = val1 [,opt2 = val2] ...]
    显示输出设备的自动检测接收器。 某些设备可能提供无法自动检测的与系统相关的接收器名称。 不能假定返回的列表总是完整的。

    ffmpeg -sinks pulse,server=192.168.0.4

    -loglevel [flags +] loglevel | -v [flags +] loglevel
    设置库使用的日志记录级别和标志。

    可选的标志前缀可以包含以下值:

    'repeat'
    表示重复的日志输出不应压缩到第一行,并且将省略“最后重复消息n次”行。

    'level'
    表示日志输出应为每个消息行添加[level]前缀。这可以用作对数着色的替代方案,例如,将日志转储到文件时。

    标志也可以单独使用,添加'+'/' - '前缀来设置/重置单个标志,而不会影响其他标志或更改日志级别。设置flags和loglevel时,最后一个标志值和loglevel之间需要一个'+'分隔符。

    loglevel是一个字符串或包含以下值之一的数字:

    'quiet, -8'
    什么都不显示;安静。

    'panic, 0'
    仅显示可能导致进程崩溃的致命错误,例如断言失败。目前还没有用于任何目的。

    'fatal, 8'
    只显示致命错误。这些是错误,在此之后该过程绝对无法继续。

    'error, 16'
    显示所有错误,包括可以从中恢复的错误。

    'warning, 24'
    显示所有警告和错误。将显示与可能不正确或意外事件相关的任何消息。

    'info, 32'
    在处理过程中显示信息性消息。这是警告和错误的补充。这是默认值。

    'verbose, 40'
    与信息相同,除了更详细。

    'debug, 48'
    显示所有内容,包括调试信息。

    'trace, 56'
    例如,要启用重复日志输出,请添加级别前缀,并将loglevel设置为verbose:

    ffmpeg -loglevel repeat+level+verbose -i input output

    另一个允许重复日志输出而不影响级别前缀标志或loglevel的当前状态的示例:

    ffmpeg [...] -loglevel +repeat

    默认情况下,程序会记录到stderr。 如果终端支持着色,则使用颜色标记错误和警告。 可以禁用日志着色设置环境变量AV_LOG_FORCE_NOCOLOR或NO_COLOR,也可以强制设置环境变量AV_LOG_FORCE_COLOR。 不推荐使用环境变量NO_COLOR,将在以后的FFmpeg版本中删除。

    -report
    将完整命令行和控制台输出转储到当前目录中名为program-YYYYMMDD-HHMMSS.log的文件。 此文件可用于错误报告。 它还意味着-loglevel调试。

    将环境变量FFREPORT设置为任何值具有相同的效果。 如果值为':' - 分隔键=值序列,则这些选项将影响报告; 如果选项值包含特殊字符或选项分隔符':',则必须对其进行转义(请参阅ffmpeg-utils手册中的“引用和转义”部分)。

    可识别以下选项:

    file
    设置用于报告的文件名; %p扩展为程序名称,%t扩展为时间戳,%%扩展为普通%

    level
    使用数值设置日志详细级别(请参阅-loglevel)。

    例如,要使用日志级别32(日志级别信息的别名)将报告输出到名为ffreport.log的文件:

    FFREPORT=file=ffreport.log:level=32 ffmpeg -i input output

    解析环境变量时的错误不是致命的,并且不会出现在报告中。

    -hide_banner
    抑制打印横幅。

    所有FFmpeg工具通常都会显示版权声明,构建选项和库版本。 此选项可用于禁止打印此信息。

    -cpuflags flags (global)
    允许设置和清除cpu标志。 此选项用于测试。 除非你知道自己在做什么,否则不要使用它。

    ffmpeg -cpuflags -sse+mmx ...
    ffmpeg -cpuflags mmx ...
    ffmpeg -cpuflags 0 ...

    此选项的可能的flag是:

    'x86'
      'mmx'
      'mmxext'
      'sse'
      'sse2'
      'sse2slow'
      'sse3'
      'sse3slow'
      'ssse3'
      'atom'
      'sse4.1'
      'sse4.2'
      'avx'
      'avx2'
      'xop'
      'fma3'
      'fma4'
      '3dnow'
      '3dnowext'
      'bmi1'
      'bmi2'
      'cmov'
    'ARM'
      'armv5te'
      'armv6'
      'armv6t2'
      'vfp'
      'vfpv3'
      'neon'
      'setend'
    'AArch64'
      'armv8'
      'vfp'
      'neon'
    'PowerPC'
      'altivec'
    'Specific Processors'
      'pentium2'
      'pentium3'
      'pentium4'
      'k6'
      'k62'
      'athlon'
      'athlonxp'
      'k8'

    5.3 AVOptions
    这些选项由libavformat,libavdevice和libavcodec库直接提供。 要查看可用AVOptions列表,请使用-help选项。 它们分为两类:

    generic
    可以为任何容器,编解码器或设备设置这些选项。 容器/设备的AVFormatContext选项和编解码器的AVCodecContext选项下列出了通用选项。

    private
    这些选项特定于给定的容器,设备或编解码器。 私有选项列在其相应的容器/设备/编解码器下。

    例如,要将ID3v2.3标头而不是默认ID3v2.4写入MP3文件,请使用MP3 muxer的id3v2_version私有选项:

    ffmpeg -i input.flac -id3v2_version 3 out.mp3

    所有编解码器AVOptions都是每个流,因此应该附加一个流说明符:

    ffmpeg -i multichannel.mxf -map 0:v:0 -map 0:a:0 -map 0:a:0 -c:a:0 ac3 -b:a:0 640k -ac:a:1 2 -c:a:1 aac -b:2 128k out.mp4

    在上面的示例中,多声道音频流被映射两次以进行输出。 第一个实例用编解码器ac3和比特率640k编码。 将第二个实例缩混为2个通道,并使用编解码器aac进行编码。 使用输出流的绝对索引为其指定128k的比特率。

    注意:-nooption语法不能用于布尔AVOptions,请使用-option 0 / -option 1。

    注意:通过将v / a / s添加到选项名称之前指定每个流AVOptions的旧的未记录方式现在已过时,将很快删除。

    5.4主要选择
    -f fmt(输入/输出)
    强制输入或输出文件格式。 通常会自动检测输入文件的格式,并从输出文件的文件扩展名中猜测,因此在大多数情况下不需要此选项。

    -i url(输入)
    输入文件网址

    -y(glodal)
    无需询问即可覆盖输出文件。

    -n(glodal)
    不要覆盖输出文件,如果已存在指定的输出文件,请立即退出。

    -stream_loop号码(输入)
    设置输入流的循环次数。 循环0表示无循环,循环-1表示无限循环。

    -c [:stream_specifier]编解码器(输入/输出,每个流)
    -codec [:stream_specifier]编解码器(输入/输出,每个流)
    为一个或多个流选择编码器(在输出文件之前使用时)或解码器(在输入文件之前使用时)。 codec是解码器/编码器的名称或特殊值副本(仅输出),表示不重新编码流。

    例如

    ffmpeg -i INPUT -map 0 -c:v libx264 -c:a copy OUTPUT

    使用libx264对所有视频流进行编码并复制所有音频流。

    对于每个流,应用最后一个匹配的c选项,因此

    ffmpeg -i INPUT -map 0 -c copy -c:v:1 libx264 -c:a:137 libvorbis OUTPUT

    将复制除第二个视频(将使用libx264编码)和第138个音频(将使用libvorbis编码)之外的所有流。

    -t duration(输入/输出)
    当用作输入选项(在-i之前)时,限制从输入文件读取的数据的持续时间。

    当用作输出选项(在输出URL之前)时,在其持续时间达到持续时间后停止写入输出。

    duration必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分

    -to和-t是互斥的,-t具有优先权。

     -to position(输入/输出)
    停止写入输出或读取位置输入。 position必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分

    -to和-t是互斥的,-t具有优先权。

    -fs limit_size(输出)
    设置文件大小限制,以字节为单位。 超出限制后不再写入更多的字节块。 输出文件的大小略大于请求的文件大小。

    -ss position (输入/输出)

    当用作输入选项(在-i之前)时,在此输入文件中寻找位置。 请注意,在大多数格式中,无法精确搜索,因此ffmpeg将在位置之前寻找最接近的搜索点。 当启用转码和-accurate_seek(默认值)时,搜索点和位置之间的这个额外段将被解码并丢弃。 在进行流复制时或使用-noaccurate_seek时,它将被保留。

    当用作输出选项(在输出URL之前)时,解码但丢弃输入,直到时间戳到达位置。

    position必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分

    -sseof position (输入)

    与-ss选项类似,但相对于“文件结束”。 这是负值在文件中较早,0表示在EOF。

    -itsoffset offset(输入)
    设置输入时间偏移。

    offset必须是持续时间规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)持续时间部分

    偏移量将添加到输入文件的时间戳中。指定正偏移意味着相应的流延迟了offset中指定的持续时间。

    -itsscale scale(输入,每个流)
    重新调整输入时间戳。 scale应该是一个浮点数。

    -timestamp date(输出)
    在容器中设置录制时间戳。

    date必须是日期规范,请参阅ffmpeg-utils(1)手册中的(ffmpeg-utils)Date部分

    -metadata [:metadata_specifier] key = value(输出,每元数据)
    设置元数据键/值对。

    可以给出可选的metadata_specifier以在流,章节或程序上设置元数据。有关详细信息,请参阅-map_metadata文档。

    此选项将覆盖使用-map_metadata设置的元数据。也可以使用空值删除元数据。

    例如,要在输出文件中设置标题:

    ffmpeg -i in.avi -metadata title="my title" out.flv

    要设置第一个音频流的语言:

    ffmpeg -i INPUT -metadata:s:a:0 language=eng OUTPUT

    -disposition [:stream_specifier] value(输出,每个流)

    设置流的处置。

    此选项会覆盖从输入流复制的处置。 也可以通过将其设置为0来删除处置。

    以下dispositions被认可:

    default
    dub
    original
    comment
    lyrics
    karaoke
    forced
    hearing_impaired
    visual_impaired
    clean_effects
    attached_pic
    captions
    descriptions
    dependent
    metadata

    例如,要将第二个音频流设为默认流:

    ffmpeg -i in.mkv -c copy -disposition:a:1 default out.mkv

    要使第二个字幕流成为默认流,并从第一个字幕流中删除默认处置:

    ffmpeg -i in.mkv -c copy -disposition:s:0 0 -disposition:s:1 default out.mkv

    要添加嵌入式封面/缩略图:

    ffmpeg -i in.mp4 -i IMAGE -map 0 -map 1 -c copy -c:v:1 png -disposition:v:1 attached_pic out.mp4

    并非所有的复用器都支持嵌入式缩略图,而且那些只支持一些格式,如JPEG或PNG。

    -program [title=title:][program_num=program_num:]st=stream[:st=stream...] (输出)

    创建具有指定标题program_num的程序,并将指定的流添加到该程序。

    -target type (输出)

    指定目标文件类型(vcd,svcd,dvd,dv,dv50)。 类型可以使用pal-,ntsc-或film-作为前缀,以使用相应的标准。 然后自动设置所有格式选项(比特率,编解码器,缓冲区大小)。 你可以输入:

    ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg

    但是,只要您知道它们与标准不冲突,您就可以指定其他选项,如:

    ffmpeg -i myfile.avi -target vcd -bf 2 /tmp/vcd.mpg

    -dn(输入/输出)
    作为输入选项,阻止文件的所有数据流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。

    作为输出选项,禁用数据记录,即自动选择或映射任何数据流。有关完全手动控制的信息,请参阅-map选项。

    -dframes number(输出)
    设置要输出的数据帧数。这是-frames:d的过时别名,您应该使用它。

    -frames [:stream_specifier] framecount(输出,每个流)
    在framecount帧之后停止写入流。

    -q [:stream_specifier] q(输出,每个流)
    -qscale [:stream_specifier] q(输出,每个流)
    使用固定质量标度(VBR)。 q / qscale的含义取决于编解码器。如果在没有stream_specifier的情况下使用qscale,那么它仅适用于视频流,这是为了保持与先前行为的兼容性,并且为2个不同的编解码器指定相同的编解码器特定值,音频和视频通常不是没有stream_specifier时的意图用来。

    -filter [:stream_specifier] filtergraph(输出,每个流)
    创建filtergraph指定的filtergraph并使用它来过滤流。

    filtergraph是要应用于流的filtergraph的描述,并且必须具有单个输入和相同类型的流的单个输出。在filtergraph中,输入与标签输入相关联,输出与标签输出相关联。有关filtergraph语法的详细信息,请参阅ffmpeg-filters手册。

    如果要创建具有多个输入和/或输出的过滤器图形,请参阅-filter_complex选项。

    -filter_script [:stream_specifier] filename(输出,每个流)
    此选项类似于-filter,唯一的区别是它的参数是要从中读取过滤器图形描述的文件的名称。

    -filter_threads nb_threads(全局)
    定义用于处理过滤器管道的线程数。每个管道都会产生一个线程池,这个线程可用于并行处理。默认值是可用CPU的数量。

    -pre [:stream_specifier] preset_name(输出,每个流)
    指定匹配流的预设。

    -stats(全球)
    打印编码进度/统计信息。默认情况下,要显式禁用它,您需要指定-nostats。

    -progress url(全局)
    将程序友好的进度信息发送到url。

    大约每秒和编码过程结束时写入进度信息。它由“key = value”行组成。 key仅包含字母数字字符。一系列进度信息的最后一个键始终是“进度”。

    -stdin
    启用标准输入的交互。默认情况下启用,除非使用标准输入作为输入。要显式禁用交互,您需要指定-nostdin。

    禁用标准输入上的交互很有用,例如,如果ffmpeg位于后台进程组中。使用ffmpeg ... </ dev / null可以获得大致相同的结果,但它需要一个shell。

    -debug_ts(全球)
    打印时间戳信息。它默认是关闭的。此选项主要用于测试和调试,输出格式可能会从一个版本更改为另一个版本,因此便携式脚本不应使用它。

    另请参阅选项-fdebug ts。

    -attach filename(输出)
    将附件添加到输出文件。这有一些格式支持,如Matroska,例如用于渲染字幕的字体。附件是作为特定类型的流实现的,因此该选项将向文件添加新流。然后可以通常的方式在此流上使用每个流选项。使用此选项创建的附件流将在所有其他流(即使用-map或自动映射创建的流)之后创建。

    请注意,对于Matroska,您还必须设置mimetype元数据标记:

    ffmpeg -i INPUT -attach DejaVuSans.ttf -metadata:s:2 mimetype=application/x-truetype-font out.mkv

    (假设附件流将在输出文件中排在第三位)。

    -dump_attachment [:stream_specifier] filename(输入,每个流)
    将匹配的附件流提取到名为filename的文件中。 如果filename为空,则将使用文件名元数据标记的值。

    例如。 提取名为'out.ttf'的文件的第一个附件:

    ffmpeg -dump_attachment:t:0 out.ttf -i INPUT

    要提取由filename标记确定的文件的所有附件:

    ffmpeg -dump_attachment:t "" -i INPUT

    技术说明 - 附件是作为编解码器extradata实现的,因此该选项实际上可用于从任何流中提取extradata,而不仅仅是附件。

    -noautorotate
    禁用基于文件元数据自动旋转视频。

    5.5视频选项

    -vframes number(输出)
    设置要输出的视频帧数。这是-frames:v的过时别名,您应该使用它。

    -r [:stream_specifier] fps(输入/输出,每个流)
    设置帧速率(Hz值,分数或缩写)。

    作为输入选项,忽略存储在文件中的任何时间戳,而是假设帧速率fps保持不变,生成时间戳。这与某些输入格式(如image2或v4l2)使用的-framerate选项不同(在旧版FFmpeg中它曾经是相同的)。如果有疑问,请使用-framerate而不是输入选项-r。

    作为输出选项,复制或丢弃输入帧以实现恒定的输出帧速率fps。

    -s [:stream_specifier] size(输入/输出,每个流)
    设置框架大小。

    作为输入选项,这是video_size private选项的快捷方式,由一些分路器识别,其帧大小未存储在文件中或者是可配置的 - 例如,原始视频或视频采集卡。

    作为输出选项,这会将scale视频滤镜插入相应滤镜图的末尾。请直接使用scale过滤器将其插入开头或其他位置。

    格式为'wxh'(默认 - 与源相同)。

    -aspect [:stream_specifier] aspect(输出,每个流)
    设置由aspect指定的视频显示宽高比。

    aspect可以是浮点数字符串,也可以是num:den形式的字符串,其中num和den是宽高比的分子和分母。例如,“4:3”,“16:9”,“1.3333”和“1.7777”是有效的参数值。

    如果与-vcodec副本一起使用,它将影响存储在容器级别的宽高比,但不会影响存储在编码帧中的宽高比(如果存在)。

    -vn(输入/输出)
    作为输入选项,阻止文件的所有视频流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。

    作为输出选项,禁用视频记录,即自动选择或映射任何视频流。有关完全手动控制的信息,请参阅-map选项。

    -vcodec codec(输出)
    设置视频编解码器。这是-codec:v的别名。

    -pass [:stream_specifier] n(输出,每个流)
    选择通行证号码(1或2)。它用于进行双通视频编码。视频的统计信息在第一次传递中记录到日志文件中(另请参见-passlog文件选项),在第二次传递中,该日志文件用于以精确请求的比特率生成视频。在第1阶段,您可能只是停用音频并将输出设置为null,Windows和Unix的示例:

    ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y NUL
    ffmpeg -i foo.mov -c:v libxvid -pass 1 -an -f rawvideo -y /dev/null

    -passlogfile [:stream_specifier] prefix(输出,每个流)
    将两遍日志文件名前缀设置为前缀,默认文件名前缀为“ffmpeg2pass”。 完整的文件名将是PREFIX-N.log,其中N是特定于输出流的数字

    -vf filtergraph(输出)
    创建filtergraph指定的filtergraph并使用它来过滤流。

    这是-filter:v的别名,请参阅-filter选项

    5.6高级视频选项

    -pix_fmt [:stream_specifier] format(输入/输出,每个流)
    设置像素格式。使用-pix_fmts显示所有支持的像素格式。如果无法选择所选的像素格式,ffmpeg将打印警告并选择编码器支持的最佳像素格式。如果pix_fmt以+为前缀,则如果无法选择所请求的像素格式,ffmpeg将退出并显示错误,并且禁用过滤器图形内的自动转换。如果pix_fmt是单个+,则ffmpeg选择与输入(或图形输出)相同的像素格式,并禁用自动转换。

    -sws_flags flags(输入/输出)
    设置SwScaler标志。

    -rc_override [:stream_specifier] override(输出,每个流)
    特定间隔的速率控制覆盖,格式为“int,int,int”列表,用斜杠分隔。两个第一个值是开始和结束帧数,最后一个是量化器,如果是正值则使用,或者质量因子,如果是负数。

    -ilme
    强制编码器中的隔行扫描支持(仅限MPEG-2和MPEG-4)。如果您的输入文件是隔行扫描并且您希望保持隔行扫描格式以获得最小损失,请使用此选项。另一种方法是使用-deinterlace对输入流进行去隔行,但是去隔行会引入损失。

    -psnr
    计算压缩帧的PSNR。

    -vstats
    将视频编码统计信息转储到vstats_HHMMSS.log。

    -vstats_file文件
    将视频编码统计转储到文件。

    -vstats_version文件
    指定要使用的vstats格式的版本。默认值为2。

    version = 1:

    frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s

    版本> 1:

    out =%2d st =%2d frame =%5d q =%2.1f PSNR =%6.2f f_size =%6d s_size =%8.0fkB time =%0.3f br =%7.1fkbits / s avg_br =%7.1fkbits / s

    -top [:stream_specifier] n(输出,每个流)
    top = 1 / bottom = 0 / auto = -1 field first

    -dc precision
    Intra_dc_precision。

    -vtag fourcc / tag(输出)
    强制视频标签/ fourcc。这是-tag:v的别名。

    -qphist(global)
    显示QP直方图

    -vbsf bitstream_filter
    不推荐见-bsf

    -force_key_frames [:stream_specifier] time [,time ...](输出,每个流)
    -force_key_frames [:stream_specifier] expr:expr(输出,每个流)
    在指定的时间戳强制关键帧,更准确地说是在每个指定时间后的第一帧。

    如果参数以expr:为前缀,则字符串expr将被解释为表达式,并针对每个帧进行求值。在评估为非零的情况下强制关键帧。

    如果其中一个时间是“chapters[delta]”,则将其扩展到文件中所有章节开始的时间,移动增量,表示为以秒为单位的时间。此选项可用于确保在章节标记或输出文件中的任何其他指定位置存在搜索点。

    例如,要在每个章节开始前的5分钟插入关键帧,加上关键帧0.1秒:

    -force_key_frames 0:05:00,chapters-0.1

    expr中的表达式可以包含以下常量:

    n
    当前处理帧的数量,从0开始

    n_forced
    强制帧的数量

    prev_forced_n
    前一个强制帧的编号,当没有强制关键帧时它是NAN

    prev_forced_t
    在前一个强制帧的时间,当没有强制关键帧时,它是NAN

    t
    当前处理帧的时间

    例如,要每5秒强制一个关键帧,您可以指定:

    -force_key_frames expr:gte(t,n_forced*5)

    要在最后一次强制时间后5秒强制关键帧,从13秒开始:

    -force_key_frames expr:if(isnan(prev_forced_t),gte(t,13),gte(t,prev_forced_t+5))

    请注意,强制使用太多关键帧对某些编码器的先行算法非常有害:使用固定GOP选项或类似选项会更有效。

    -copyinkf [:stream_specifier](输出,每个流)
    进行流复制时,还要复制开头找到的非关键帧。

    -init_hw_device type [= name] [:device [,key = value ...]]
    使用给定的设备参数初始化名为name的类型类型的新硬件设备。如果未指定名称,则将收到“type%d”形式的默认名称。

    设备的含义和以下参数取决于设备类型:

    cuda
    device是CUDA设备的编号。

    dxva2
    device是Direct3D 9显示适配器的编号。

    vaapi
    device是X11显示名称或DRM渲染节点。如果未指定,它将尝试打开默认的X11显示($ DISPLAY),然后打开第一个DRM渲染节点(/ dev / dri / renderD128)。

    vdpau
    device是X11显示名称。如果未指定,它将尝试打开默认的X11显示($ DISPLAY)。

    qsv
    设备选择'MFX_IMPL_ *'中的值。允许的值是:

    auto
    sw
    hw
    auto_any
    hw_any
    wh2
    hw3
    hw4
    如果未指定,则使用“auto_any”。 (注意,通过创建适合平台的子设备('dxva2'或'vaapi')然后从中导出QSV设备,可能更容易实现QSV的预期结果。)

    opencl
    设备选择平台和设备作为platform_index.device_index。

    还可以使用键值对来过滤该组设备,以仅查找与特定平台或设备字符串匹配的设备。

    可用作过滤器的字符串是:

    platform_profile
    platform_version
    platform_name
    platform_vendor
    platform_extensions
    device_name
    device_vendor
    driver_version
    device_version
    device_profile
    device_extensions
    device_type

    索引和过滤器必须一起唯一地选择设备。

    例子:
    -init_hw_device opencl:0.1
    在第一个平台上选择第二个设备。

    -init_hw_device opencl:,device_name = Foo9000
    选择名称中包含字符串Foo9000的设备。

    -init_hw_device opencl:1,device_type = gpu,device_extensions = cl_khr_fp16
    在支持cl_khr_fp16扩展的第二个平台上选择GPU设备。

    -init_hw_device type [= name] @source
    初始化名为name的类型类型的新硬件设备,从名为source的现有设备派生它。

    -init_hw_device list
    列出此ffmpeg版本中支持的所有硬件设备类型。

    -filter_hw_device name
    将名为name的硬件设备传递给任何过滤器图形中的所有过滤器。这可用于设置要使用hwupload过滤器上传到的设备,或使用hwmap过滤器映射到的设备。其他过滤器在需要硬件设备时也可以使用此参数。请注意,这通常仅在输入尚未存在于硬件帧中时才需要 - 如果是,则过滤器将从它们作为输入接收的帧的上下文中获取它们所需的设备。

    这是一个全局设置,因此所有过滤器都将接收相同的设备。

    -hwaccel [:stream_specifier] hwaccel(输入,每个流)
    使用硬件加速来解码匹配的流。 hwaccel的允许值为:

    none
    不要使用任何硬件加速(默认)。

    auto
    自动选择硬件加速方法。

    vdpau
    使用VDPAU(用于Unix的视频解码和Presentation API)硬件加速。

    dxva2
    使用DXVA2(DirectX视频加速)硬件加速。

    vaapi
    使用VAAPI(视频加速API)硬件加速。

    qsv
    使用英特尔QuickSync视频加速进行视频转码。

    与大多数其他值不同,此选项不启用加速解码(仅在选择qsv解码器时自动使用),而是加速转码,而不将帧复制到系统内存中。

    为使其工作,解码器和编码器都必须支持QSV加速,并且不得使用任何滤波器。

    如果所选的hwaccel不可用或所选解码器不支持,则此选项无效。

    请注意,大多数加速方法都是用于回放,并且不会比现代CPU上的软件解码更快。此外,ffmpeg通常需要将解码后的帧从GPU内存复制到系统内存中,从而导致性能进一步下降。因此,该选项主要用于测试。

    -hwaccel_device [:stream_specifier] hwaccel_device(输入,每个流)
    选择要用于硬件加速的设备。

    仅当指定了-hwaccel选项时,此选项才有意义。它可以引用通过名称使用-init_hw_device创建的现有设备,也可以创建新设备,就像'-init_hw_device'类型:hwaccel_device之前被调用一样。

    -hwaccels
    列出此ffmpeg构建中支持的所有硬件加速方法。

    5.7音频选项

    -frames number(输出)
    设置要输出的音频帧数。这是-frames:a的过时别名,您应该使用它。

    -ar [:stream_specifier] freq(输入/输出,每个流)
    设置音频采样频率。对于输出流,默认情况下将其设置为相应输入流的频率。对于输入流,此选项仅对音频抓取设备和原始分路器有意义,并映射到相应的分路器选项。

    -qq q(输出)
    设置音频质量(特定于编解码器,VBR)。这是-q:a的别名。

    -ac [:stream_specifier]通道(输入/输出,每个流)
    设置音频通道的数量。对于输出流,默认设置为输入音频通道的数量。对于输入流,此选项仅对音频抓取设备和原始分路器有意义,并映射到相应的分路器选项。

    -an(输入/输出)
    作为输入选项,阻止文件的所有音频流被过滤或自动选择或映射以用于任何输出。请参阅-discard选项以单独禁用流。

    作为输出选项,禁用音频记录,即自动选择或映射任何音频流。有关完全手动控制的信息,请参阅-map选项。

    -acodec编解码器(输入/输出)
    设置音频编解码器。这是-codec的别名:a。

    -sample_fmt [:stream_specifier] sample_fmt(输出,每个流)
    设置音频样本格式。使用-sample_fmts获取支持的样本格式列表。

    -af filtergraph(输出)
    创建filtergraph指定的filtergraph并使用它来过滤流。

    这是-filter:a的别名,请参阅-filter选项

    5.8高级音频选项

    -atag fourcc / tag(输出)
    强制音频标签/ fourcc。 这是-tag:a的别名。

    -absf bitstream_filter
    不推荐使用,请参阅-bsf

    -guess_layout_max channels(输入,每个流)
    如果某些输入通道布局未知,请尝试仅猜测它是否对应于最多指定数量的通道。 例如,2告诉ffmpeg将1声道识别为单声道,将2声道识别为立体声而不是6声道识别为5.1。 默认是总是试图猜测。 使用0禁用所有猜测。

    5.9字幕选项

    -scodec编解码器(输入/输出)
    设置字幕编解码器。 这是-codec:s的别名。

    -sn(输入/输出)
    作为输入选项,阻止文件的所有字幕流被过滤或自动选择或映射以用于任何输出。 请参阅-discard选项以单独禁用流。

    作为输出选项,禁用字幕记录,即自动选择或映射任何字幕流。 有关完全手动控制的信息,请参阅-map选项。

    -sbsf bitstream_filter
    不推荐使用,请参阅-bsf

    5.10高级字幕选项

    -fix_sub_duration
    修复字幕持续时间。 对于每个字幕,等待同一流中的下一个数据包并调整第一个数据包的持续时间以避免重叠。 对于一些字幕编解码器,尤其是DVB字幕,这是必要的,因为原始分组中的持续时间仅是粗略估计,并且结尾实际上由空字幕帧标记。 必要时未能使用此选项会导致由于非单调时间戳而导致的夸大持续时间或多路复用失败。

    请注意,此选项将延迟所有数据的输出,直到下一个字幕包被解码:它可能会大量增加内存消耗和延迟。

    -canvas_size大小
    设置用于渲染字幕的画布大小。

    5.11高级选项

    -map [ - ] input_file_id [:stream_specifier] [?] [,sync_file_id [:stream_specifier]] | [linklabel](输出)
    将一个或多个输入流指定为输出文件的源。每个输入流由输入文件索引input_file_id和输入文件中的输入流索引input_stream_id标识。两个索引都从0开始。如果指定,sync_file_id:stream_specifier设置哪个输入流用作表示同步参考。

    命令行中的第一个-map选项指定输出流0的源,第二个-map选项指定输出流1的源,等等。

    - 流标识符之前的字符创建“negative”映射。它禁用已创建映射的匹配流。

    尾随的"?"在流索引之后将允许地图是可选的:如果地图不匹配流,则将忽略地图而不是失败。请注意,如果使用无效的输入文件索引,映射仍将失败;例如,如果地图指的是不存在的输入。

    另一种[linklabel]表单将把复杂过滤器图形的输出(请参阅-filter_complex选项)映射到输出文件。 linklabel必须对应于图中定义的输出链接标签。

    例如,将所有流从第一个输入文件映射到输出

    ffmpeg -i INPUT -map 0 output

    例如,如果第一个输入文件中有两个音频流,则这些流由“0:0”和“0:1”标识。 您可以使用-map选择要放在输出文件中的流。 例如:

    ffmpeg -i INPUT -map 0:1 out.wav

    将由“0:1”标识的INPUT中的输入流映射到out.wav中的(单个)输出流。

    例如,要从输入文件a.mov(由标识符“0:2”指定)中选择索引为2的流,并从输入b.mov(由标识符“1:6”指定)中选择索引为6的流, 并将它们复制到输出文件out.mov:

    ffmpeg -i a.mov -i b.mov -c copy -map 0:2 -map 1:6 out.mov

    要从输入文件中选择所有视频和第三个音频流:

    ffmpeg -i INPUT -map 0:v -map 0:a:2 OUTPUT

    要映射除第二个音频之外的所有流,请使 negative映射

    ffmpeg -i INPUT -map 0 -map -0:a:1 OUTPUT

    要映射来自第一个输入的视频和音频流,并使用尾随?,如果第一个输入中没有音频流,则忽略音频映射:

    ffmpeg -i INPUT -map 0:v -map 0:a? OUTPUT

    要选择英语音频流:

    ffmpeg -i INPUT -map 0:m:language:eng OUTPUT

    请注意,使用此选项会禁用此输出文件的默认映射。

    -ignore_unknown
    如果尝试复制此类流,则忽略具有未知类型的输入流而不是失败。

    -copy_unknown
    如果尝试复制此类流,则允许复制具有未知类型的输入流而不是失败。

    -map_channel [input_file_id.stream_specifier.channel_id | -1] [?] [:output_file_id.stream_specifier]
    将音频通道从给定输入映射到输出。 如果未设置output_file_id.stream_specifier,则音频通道将映射到所有音频流。

    使用“-1”而不是input_file_id.stream_specifier.channel_id将映射静音通道。

    尾随?将允许map_channel是可选的:如果map_channel不匹配任何通道,则将忽略map_channel而不是失败。

    例如,假设INPUT是立体声音频文件,您可以使用以下命令切换两个音频通道:

    ffmpeg -i INPUT -map_channel 0.0.1 -map_channel 0.0.0 OUTPUT

    如果你想静音第一个频道并保持第二个频道:

    ffmpeg -i INPUT -map_channel -1 -map_channel 0.0.1 OUTPUT

    “-map_channel”选项的顺序指定输出流中通道的顺序。 输出通道布局是从映射的通道数量中猜出的(单声道,如果一个“-map_channel”,立体声,如果是两个,等等)。 如果输入和输出通道布局不匹配,则使用“-ac”组合“-map_channel”可以更新通道增益级别(例如两个“-map_channel”选项和“-ac 6”)。

    您还可以将输入的每个通道提取到特定输出; 以下命令将INPUT音频流(file0,stream0)的两个通道提取到相应的OUTPUT_CH0和OUTPUT_CH1输出:

    ffmpeg -i INPUT -map_channel 0.0.0 OUTPUT_CH0 -map_channel 0.0.1 OUTPUT_CH1

    以下示例将立体声输入的通道拆分为两个单独的流,这些流被放入相同的输出文件中:

    ffmpeg -i stereo.wav -map 0:0 -map 0:0 -map_channel 0.0.0:0.0 -map_channel 0.0.1:0.1 -y out.ogg

    请注意,目前每个输出流只能包含来自单个输入流的通道; 例如,您不能使用“-map_channel”来选择包含在不同流(来自相同或不同文件)中的多个输入音频通道,并将它们合并为单个输出流。 因此,例如,当前不可能将两个单独的单声道流转换成单个立体声流。 然而,将立体声流分成两个单声道单声道流是可能的。

    如果您需要此功能,可能的解决方法是使用amerge过滤器。 例如,如果您需要将媒体(此处为input.mkv)与2个单声道音频流合并为一个立体声通道音频流(并保留视频流),则可以使用以下命令:

    ffmpeg -i input.mkv -filter_complex "[0:1] [0:2] amerge" -c:a pcm_s16le -c:v copy output.mkv

    要从第一个输入映射前两个音频通道,并使用尾随?,如果第一个输入是单声道而不是立体声,请忽略音频通道映射:

    ffmpeg -i INPUT -map_channel 0.0.0 -map_channel 0.0.1? OUTPUT

    -map_metadata [:metadata_spec_out] infile [:metadata_spec_in](输出,每元数据)
    从infile设置下一个输出文件的元数据信息。 请注意,这些是文件索引(从零开始),而不是文件名。 可选的metadata_spec_in / out参数指定要复制的元数据。 元数据说明符可以具有以下形式:

    g
    全局元数据,即应用于整个文件的元数据

    s [:stream_spec]
    每个流元数据。 stream_spec是Stream说明符章节中描述的流说明符。 在输入元数据说明符中,复制第一个匹配流。 在输出元数据说明符中,将所有匹配的流复制到。

    c:chapter_index
    每章元数据。 chapter_index是从零开始的章节索引。

    p:program_index
    每个程序元数据。 program_index是从零开始的程序索引。

    如果省略元数据说明符,则默认为全局。

    默认情况下,从第一个输入文件复制全局元数据,每个流和每章元数据与流/章一起复制。 通过创建相关类型的任何映射来禁用这些默认映射。 负文件索引可用于创建仅禁用自动复制的虚拟映射。

    例如,将元数据从输入文件的第一个流复制到输出文件的全局元数据:

    ffmpeg -i in.ogg -map_metadata 0:s:0 out.mp3

    要反过来,即将全局元数据复制到所有音频流:

    ffmpeg -i in.mkv -map_metadata:s:a 0:g out.mkv

    请注意,简单0在此示例中也可以正常工作,因为默认情况下采用全局元数据。

    -map_chapters input_file_index(输出)
    将带有索引input_file_index的输入文件中的章节复制到下一个输出文件。如果未指定章节映射,则从第一个输入文件复制章节,至少有一章。使用负文件索引禁用任何章节复制。

    -benchmark(全局)
    在编码结束时显示基准信息。显示实际使用的系统和用户时间以及最大内存消耗。所有系统都不支持最大内存消耗,如果不支持,通常会显示为0。

    -benchmark_all(全局)
    在编码期间显示基准信息。显示在各个步骤中使用的实际,系统和用户时间(音频/视频编码/解码)。

    -timelimit duration(全局)
    ffmpeg运行持续时间秒后退出。

    -dump(全局)
    将每个输入数据包转储到stderr。

    -hex(全局)
    转储数据包时,也会转储有效负载。

    -re(输入)
    以本机帧速率读取输入。主要用于模拟抓取设备或实时输入流(例如,从文件读取时)。不应与实际的抓取设备或实时输入流一起使用(它可能导致数据包丢失)。默认情况下,ffmpeg尝试尽可能快地读取输入。此选项将减慢输入读取到输入的本机帧速率。它对于实时输出(例如直播)很有用。

    -vsync参数
    视频同步方法。出于兼容性原因,旧值可以指定为数字。必须始终将新添加的值指定为字符串。

    0,passthrough
    每个帧都以其从分路器到复用器的时间戳传递。

    1,cfr
    将复制和删除帧以实现所要求的恒定帧速率。

    2,vfr
    帧以其时间戳传递或丢弃,以防止2帧具有相同的时间戳。

    drop
    作为passthrough但是会破坏所有时间戳,使muxer根据帧速率生成新的时间戳。

    -1,auto
    根据复用器功能选择1到2之间。这是默认方法。

    注意,在此之后,复用器可以进一步修改时间戳。 例如,在启用格式选项avoid_negative_ts的情况下。

    使用-map,您可以选择应从哪个流中获取时间戳。 您可以保持视频或音频不变,并将剩余的流同步到未更改的流。

    -frame_drop_threshold parameter
    帧丢弃阈值,指定视频帧在丢弃之前可以有多少。在帧速率单位中,1.0是一帧。默认值为-1.1。一个可能的用例是在出现噪声时间戳的情况下避免使用framedrops,或者在精确时间戳的情况下提高帧丢弃精度。

    -async samples_per_second
    音频同步方法。 “拉伸/挤压”音频流以匹配时间戳,参数是音频更改的每秒最大采样数。 -async 1是一种特殊情况,其中仅校正音频流的开始而不进行任何后续校正。

    注意,在此之后,复用器可以进一步修改时间戳。例如,在启用格式选项avoid_negative_ts的情况下。

    此选项已被弃用。请改用aresample音频过滤器。

    -copyts
    不处理输入时间戳,但保留其值而不尝试清理它们。特别是,不要删除初始启动时间偏移值。

    请注意,根据vsync选项或特定的多路复用器处理(例如,如果启用了格式选项avoid_negative_ts),即使选择此选项,输出时间戳也可能与输入时间戳不匹配。

    -start_at_zero
    与copyts一起使用时,移位输入时间戳,使它们从零开始。

    这意味着使用例如-ss 50将使输出时间戳从50秒开始,无论输入文件的起始时间戳是什么。

    -copytb mode
    指定在流复制时如何设置编码器时基。 mode是一个整数数值,可以采用以下值之一:

    1
    使用分路器时基。

    时基从相应的输入分路器复制到输出编码器。当复制具有可变帧速率的视频流时,有时需要避免非单调增加时间戳。

    0
    使用解码器时基。

    时基从相应的输入解码器复制到输出编码器。

    -1
    尝试自动进行选择,以生成合理的输出。

    默认值为-1。

    -enc_time_base [:stream_specifier] timebase(输出,每个流)
    设置编码器时基。 timebase是一个浮点数,可以采用以下值之一:

    0
    根据媒体类型分配默认值。

    对于视频 - 使用1 /帧速率,用于音频 - 使用1 / samplerate。

    -1
    尽可能使用输入流时基。

    如果输入流不可用,将使用默认时基。

    >0
    使用提供的数字作为时基。

    该字段可以作为两个整数的比率(例如1:24,1:48000)或浮点数(例如0.04166,2.0833e-5)提供。

    默认值为0。

    -bitexact(输入/输出)
    为(de)muxer和(de / en)编码器启用bitexact模式

    -shortest(输出)
    最短输入流结束时完成编码。

    -dts_delta_threshold
    时间戳不连续性增量阈值。

    -muxdelay秒(输出)
    设置最大解复用 - 解码延迟。

    -muxpreload seconds(输出)
    设置初始demux-decode延迟。

    -streamid output-stream-index:new-value(output)
    将新的stream-id值分配给输出流。 应在其应用的输出文件名之前指定此选项。 对于存在多个输出文件的情况,可以将streamid重新分配给不同的值。

    例如,要将输出mpegts文件的流0 PID设置为33,将流1 PID设置为36:

    ffmpeg -i inurl -streamid 0:33 -streamid 1:36 out.ts

    -bsf [:stream_specifier] bitstream_filters(输出,每个流)
    设置用于匹配流的比特流过滤器。 bitstream_filters是逗号分隔的比特流过滤器列表。 使用-bsfs选项获取比特流过滤器列表。

    ffmpeg -i h264.mp4 -c:v copy -bsf:v h264_mp4toannexb -an out.h264
    ffmpeg -i file.mov -an -vn -bsf:s mov2textsub -c:s copy -f rawvideo sub.txt

    -tag [:stream_specifier] codec_tag(输入/输出,每个流)
    强制标记/ fourcc用于匹配流。

    -timecode hh:mm:ssSEPff
    指定写入的时间码。 对于非丢弃时间码,SEP为':',对于丢弃,SEP为';'(或'.')。

    ffmpeg -i input.mpg -timecode 01:02:03.04 -r 30000/1001 -s ntsc output.mpg

    -filter_complex filtergraph(全局)
    定义复杂的滤波器图形,即具有任意数量的输入和/或输出的滤波器图形。 对于简单图形 - 具有一个输入和一个相同类型的输出的图形 - 请参阅-filter选项。 filtergraph是filtergraph的描述,如ffmpeg-filters手册的“Filtergraph语法”部分所述。

    输入链接标签必须使用[file_index:stream_specifier]语法引用输入流(即与-map使用相同)。 如果stream_specifier匹配多个流,则将使用第一个流。 未标记的输入将连接到匹配类型的第一个未使用的输入流。

    输出链接标签用-map引用。 未标记的输出将添加到第一个输出文件中。

    请注意,使用此选项,可以仅使用没有普通输入文件的lavfi源。

    例如,在视频上叠加图像

    ffmpeg -i video.mkv -i image.png -filter_complex '[0:v][1:v]overlay[out]' -map
    '[out]' out.mkv

    这里[0:v]指的是第一个输入文件中的第一个视频流,它链接到覆盖滤波器的第一个(主)输入。 类似地,第二输入中的第一视频流链接到覆盖的第二(覆盖)输入。

    假设每个输入文件中只有一个视频流,我们可以省略输入标签,所以上面相当于

    ffmpeg -i video.mkv -i image.png -filter_complex 'overlay[out]' -map
    '[out]' out.mkv

    此外,我们可以省略输出标签,过滤器图形的单个输出将自动添加到输出文件中,因此我们可以简单地写

    ffmpeg -i video.mkv -i image.png -filter_complex 'overlay' out.mkv

    使用lavfi颜色源生成5秒纯红色视频:

    ffmpeg -filter_complex 'color=c=red' -t 5 out.mkv

    -filter_complex_threads nb_threads(全局)
    定义用于处理filter_complex图的线程数。与filter_threads类似,但仅用于-filter_complex图。默认值是可用CPU的数量。

    -lavfi filtergraph(全局)
    定义复杂的滤波器图形,即具有任意数量的输入和/或输出的滤波器图形。相当于-filter_complex。

    -filter_complex_script filename(全局)
    此选项类似于-filter_complex,唯一的区别是它的参数是要从中读取复杂filtergraph描述的文件的名称。

    -accurate_seek(输入)
    此选项使用-ss选项启用或禁用输入文件中的准确搜索。它默认启用,因此在转码时搜索是准确的。使用-noaccurate_seek来禁用它,这可能是有用的,例如复制某些流并转码其他流时。

    -seek_timestamp(输入)
    此选项使用-ss选项启用或禁用输入文件中的时间戳搜索。默认情况下禁用它。如果启用,则-ss选项的参数将被视为实际时间戳,并且不会被文件的开始时间偏移。这仅适用于不是从时间戳0开始的文件,例如传输流。

    -thread_queue_size大小(输入)
    此选项设置从文件或设备读取时排队的最大数据包数。对于低延迟/高速率直播流,如果不及时读取数据包,则可以丢弃数据包;提高这个价值可以避免它。

    -sdp_file文件(全局)
    将输出流的sdp信息打印到文件。这允许在至少一个输出不是rtp流时转储sdp信息。 (要求至少一种输出格式为rtp)。

    -discard(输入)
    允许从流中丢弃特定的流或帧。任何输入流都可以使用全部值完全丢弃,而来自流的帧的选择性丢弃在解复用器处发生,并且不被所有解复用器支持。

    none
    不丢弃任何帧。

    default
    默认值,不丢弃任何帧。

    noref
    丢弃所有非参考帧。

    bidir
    丢弃所有双向帧。

    nokey
    丢弃除关键帧之外的所有帧。

    all
    丢弃所有帧。

    -abort_on标志(全局)
    在各种条件下停止并中止。可以使用以下标志:

    empty_output
    没有数据包传递给多路复用器,输出为空。

    -xerror(全局)
    出错时停止并退出

    -max_muxing_queue_size packets(输出,每个流)
    当转码音频和/或视频流时,ffmpeg将不会开始写入输出,直到它为每个这样的流有一个数据包。在等待这种情况发生时,其他流的数据包将被缓冲。此选项为数据包中的匹配输出流设置此缓冲区的大小。

    对于大多数用途,此选项的默认值应足够高,因此如果您确定需要,请仅触摸此选项。

    作为特殊例外,您可以使用位图字幕流作为输入:它将转换为与文件中最大视频大小相同的视频,如果没有视频则转换为720x576。请注意,这是一个实验性的临时解决方案。一旦libavfilter对字幕有适当的支持,它将被删除。

    例如,要在以MPEG-TS格式存储的DVB-T录制之上对字幕进行硬编码,将字幕延迟1秒:

    ffmpeg -i input.ts -filter_complex \
      '[#0x2ef] setpts=PTS+1/TB [sub] ; [#0x2d0] [sub] overlay' \
      -sn -map '#0x2dc' output.mkv

    (0x2d0,0x2dc和0x2ef分别是视频,音频和字幕流的MPEG-TS PID; 0:0,0:3和0:7也可以工作)

    5.12预设文件

    预设文件包含一系列option = value对,每行一个,指定在命令行上难以指定的选项序列。 以哈希('#')字符开头的行将被忽略,并用于提供注释。 检查FFmpeg源代码树中的预置目录以获取示例。

    有两种类型的预设文件:ffpreset和avpreset文件。

    5.12.1 ffpreset文件

    ffpreset文件使用vpre,apre,spre和fpre选项指定。 fpre选项使用预设的文件名而不是预设名称作为输入,可用于任何类型的编解码器。对于vpre,apre和spre选项,预设文件中指定的选项将应用于当前所选的与预设选项相同类型的编解码器。

    传递给vpre,apre和spre预设选项的参数根据以下规则标识要使用的预设文件:

    首先,ffmpeg在$FFMPEG_DATADIR(如果设置)和$HOME / .ffmpeg目录中搜索名为arg.ffpreset的文件,并在配置时定义的datadir(通常为PREFIX/share/ ffmpeg)或沿ffpresets文件夹中搜索按顺序在win32上执行。例如,如果参数是libvpx-1080p,它将搜索文件libvpx-1080p.ffpreset。

    如果未找到此类文件,则ffmpeg将在上述目录中搜索名为codec_name-arg.ffpreset的文件,其中codec_name是将应用预设文件选项的编解码器的名称。例如,如果您使用-vcodec libvpx选择视频编解码器并使用-vpre 1080p,那么它将搜索文件libvpx-1080p.ffpreset。

    5.12.2 avpreset文件

    avpreset文件使用pre选项指定。 它们的工作方式类似于ffpreset文件,但它们只允许特定于编码器的选项。 因此,不能使用指定编码器的选项=值对。

    当指定pre选项时,ffmpeg将在目录$AVCONV_DATADIR(如果设置)和$HOME/ .avconv中查找带有后缀.avpreset的文件,并在配置时定义的datadir中查找(通常为PREFIX / share / ffmpeg) , 以该顺序。

    首先,ffmpeg在上述目录中搜索名为codec_name-arg.avpreset的文件,其中codec_name是将应用预设文件选项的编解码器的名称。 例如,如果您使用-vcodec libvpx选择视频编解码器并使用-pre 1080p,那么它将搜索文件libvpx-1080p.avpreset。

    如果未找到此类文件,则ffmpeg将在相同目录中搜索名为arg.avpreset的文件。

    6 例子

    6.1视频和音频抓取

    如果您指定输入格式和设备,则ffmpeg可以直接获取视频和音频。

    ffmpeg -f oss -i /dev/dsp -f video4linux2 -i /dev/video0 /tmp/out.mpg

    或者使用ALSA音频源(单声道输入,卡ID 1)而不是OSS:

    ffmpeg -f alsa -ac 1 -i hw:1 -f video4linux2 -i /dev/video0 /tmp/out.mpg

    请注意,在使用任何电视查看器(例如Gerd Knorr的xawtv)启动ffmpeg之前,您必须激活正确的视频源和频道。 您还必须使用标准混音器正确设置音频录制电平。

    6.2 X11抓取

    用ffmpeg via抓取X11显示器

    ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0 /tmp/out.mpg

    0.0是X11服务器的display.screen number,与DISPLAY环境变量相同。

    ffmpeg -f x11grab -video_size cif -framerate 25 -i :0.0+10,20 /tmp/out.mpg

    0.0是X11服务器的display.screen number,与DISPLAY环境变量相同。 10是x偏移,20是y偏移,用于抓取。

    6.3视频和音频文件格式转换

    任何支持的文件格式和协议都可以作为ffmpeg的输入:

    例子:

    您可以使用YUV文件作为输入:

    ffmpeg -i /tmp/test%d.Y /tmp/out.mpg

    它将使用这些文件:

    /tmp/test0.Y, /tmp/test0.U, /tmp/test0.V,
    /tmp/test1.Y, /tmp/test1.U, /tmp/test1.V, etc...

    Y文件使用U和V文件分辨率的两倍。 它们是原始文件,没有标题。 它们可以由所有体面的视频解码器生成。 如果ffmpeg无法猜测,则必须使用-s选项指定图像的大小。

    您可以从原始YUV420P文件输入:

    ffmpeg -i /tmp/test.yuv /tmp/out.avi

    test.yuv是一个包含原始YUV平面数据的文件。 每个帧由Y平面组成,接着是U和V平面,半垂直和水平分辨率。

    您可以输出到原始YUV420P文件:

    ffmpeg -i mydivx.avi hugefile.yuv

    您可以设置多个输入文件和输出文件:

    ffmpeg -i /tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg

    将音频文件a.wav和原始YUV视频文件a.yuv转换为MPEG文件a.mpg。

    您还可以同时进行音频和视频转换:

    ffmpeg -i /tmp/a.wav -ar 22050 /tmp/a.mp2

    将a.wav转换为22050 Hz采样率的MPEG音频。

    您可以同时编码为多种格式,并定义从输入流到输出流的映射:

    ffmpeg -i /tmp/a.wav -map 0:a -b:a 64k /tmp/a.mp2 -map 0:a -b:a 128k /tmp/b.mp2

    将a.wav转换为64 kbits的a.mp2和128 kbits的b.mp2。 '-map file:index'按输出流定义的顺序指定每个输出流使用哪个输入流。

    您可以转码解密的VOB:

    ffmpeg -i snatch_1.vob -f avi -c:v mpeg4 -b:v 800k -g 300 -bf 2 -c:a libmp3lame -b:a 128k snatch.avi

    这是一个典型的DVD翻录示例; 输入是一个VOB文件,输出一个带有MPEG-4视频和MP3音频的AVI文件。 请注意,在此命令中,我们使用B帧,因此MPEG-4流与DivX5兼容,GOP大小为300,这意味着对于29.97fps输入视频,每10秒一帧内帧。 此外,音频流是MP3编码的,因此您需要通过传递--enable-libmp3lame来启用LAME支持。 该映射对于DVD转码特别有用,以获得所需的音频语言。

    注意:要查看支持的输入格式,请使用ffmpeg -demuxers。

    您可以从视频中提取图像,也可以从许多图像中创建视频:
    用于从视频中提取图像:

    ffmpeg -i foo.avi -r 1 -s WxH -f image2 foo-%03d.jpeg

    这将从视频中每秒提取一个视频帧,并将其输出到名为foo-001.jpeg,foo-002.jpeg等的文件中。图像将被重新调整以适应新的WxH值。

    如果只想提取有限数量的帧,可以将上述命令与-frames:v或-t选项结合使用,或与-ss结合使用以开始从某个时间点提取。

    要从许多图像创建视频:

    ffmpeg -f image2 -framerate 12 -i foo-%03d.jpeg -s WxH foo.avi

    语法foo-%03d.jpeg指定使用由填充零的三个数字组成的十进制数来表示序列号。 它与C printf函数支持的语法相同,但只有接受普通整数的格式才适合。

    导入图像序列时,-i还支持在内部扩展类似shell的通配符模式(globbing),方法是选择特定于image2的-pattern_type glob选项。

    例如,要从与glob模式匹配的文件名创建视频foo  -  * .jpeg:

    ffmpeg -f image2 -pattern_type glob -framerate 12 -i 'foo-*.jpeg' -s WxH foo.avi

    您可以在输出中放置许多相同类型的流:

    ffmpeg -i test1.avi -i test2.avi -map 1:1 -map 1:0 -map 0:1 -map 0:0 -c copy -y test12.nut

    生成的输出文件test12.nut将以相反的顺序包含输入文件中的前四个流。

    强制CBR视频输出:

    ffmpeg -i myfile.avi -b 4000k -minrate 4000k -maxrate 4000k -bufsize 1835k out.m2v

    四个选项lmin,lmax,mblmin和mblmax使用'lambda'单位,但您可以使用QP2LAMBDA常数轻松转换'q'单位:

    ffmpeg -i src.ext -lmax 21*QP2LAMBDA dst.ext

    7另见

    ffmpeg-allffplayffprobeffmpeg-utilsffmpeg-scalerffmpeg-resamplerffmpeg-codecsffmpeg-bitstream-filtersffmpeg-formatsffmpeg-devicesffmpeg-protocolsffmpeg-filters

     

    英文文档地址:http://www.ffmpeg.org/ffmpeg.html#Options

     

    展开全文
  • 大多数应用,多数实体或对象可以被序列化为包含键值对的 JSON 对象。但是很少只是简单的键值列表,更多时候它拥有复杂的数据结构,比如包含日期、地理位置、另一个对象或者数组。 一个 键 可以是一个字段或字段...
  • hibernate 中文文档

    万次阅读 多人点赞 2015-01-19 00:09:06
    参考文档 3.2.0 CR1 目录 前言 1. 翻译说明2. 版权声明 前言1. 创建一个注解项目 1.1. 系统需求1.2. 系统配置 2. 实体Bean 2.1. 简介2.2. 用EJB3注解进行映射 2.2.1. 声明实体bean 2.2....
  • 怎样让EXCEL表出现升序、降序选中日期列、或日期的任一单元格,选择:排序和筛选--升序(这里以升序为例,也可以用降序或自定义排序); 点击后,日期列即按从小到大排序,同表的其它列也跟着自动调整。Excel...
  • Peewee中文文档【一】:安装与测试

    千次阅读 2017-07-06 10:21:15
    最前面的一些话:第一次尝试翻译英语技术文档,比较具有挑战性。本来是计划和同事一起翻译,但是因为人事变故,只剩下我一个人继续。如果您发现翻译有任何不当的地方,请及时地指正。如果你觉得文档翻译得还...
  • Sequelize 中文API文档

    万次阅读 2017-08-07 20:31:46
    Sequelize 中文API文档-1. 快速入门、Sequelize类  2016年05月20日 35766 声明 Sequelize类是引用sequlize模块后获取一个顶级对象,我们通过它来创建sequlize实例,也可以通过该对象来获取模内其它对象...
  • 文档(Documents)MongoDB以BSON的形式存储文档。BSON是JSON的二进制表现形式,但包含更多的数据类型。文档结构MongoDB的文档由键值对(field-and-value pairs)组成,如:{ field1: value1, field2: value2, ...
  • 这个工具可以用来创建python文档,现在很多项目都使用它来制作文档。使用它内建的功能,生成一个真正精细的浏览系统,以及一个简单但足够用的客户端javascript搜索引擎。 使用方法: 1.easy_install Sphinx 2....
  • 可以说,学姐给我的这份文档真的我的知识查漏补缺,面试问到了好多,值得收藏。
  • 文档APIs 本节首先简要介绍Elasticsearch的数据复制模型,然后会对CRUD API进行详细说明: 单文档API Index API Get API) Delete API Update API 多文档API Multi Get API Bulk API Delete By Query API Update ...
  • Spring Data Jpa 中文翻译文档

    千次阅读 2018-07-26 20:02:03
    Spring Data Jpa 中文翻译文档 标签(空格分隔): JPA Spring Spring Data JPA - 参考文档 Oliver Gierke Thomas Darimont Christoph Strobl Mark Paluch 杰伊布莱恩特 版本 2.1.0.M3,2018-05-17 ©2008...
  • JFreeChart API中文文档

    千次阅读 2013-03-17 15:21:13
    JFreeChart类: void setAntiAlias(boolean flag) 字体模糊边界 ...void setBackgroundImageAlignment(int alignment) 背景图片对齐方式(参数常量org.jfree.ui.Align类定义) void setBa
  • 配置IronPython脚本以在文档属性更改时自动运行 检索dxp文件/库路径 列出分析的所有文档属性 迭代所有文档属性 检索库项目的URL 将页面渲染为图像 使用自动化服务本地或服务器上嵌入数据并保存...
  • 上编文档中http://blog.csdn.net/lzk0431/article/details/79379213,我写了如何按照照片名称日期分类整理,后来发现有的手机或相机拍出来的照片,名称并不包含日期,但照片的属性有拍照日期,所以本贴按照...
  • mini-XML 中文文档

    千次阅读 2015-01-04 10:57:15
    内存创建和管理XML文档的函数. 读UTF-8和UTF-16 编码的XML文件和字符串. 写UTF-8 编码的XML文件和字符串. 支持任意的元素名称,属性以及属性值,没有任何其他限制,仅受限于有效内存. 支持整形、浮点、自定义(...
  • EBS Form实现强大的排序效果

    千次阅读 2012-09-27 14:56:25
    EBS Form实现强大的排序...EBS的Form排序功能一直是不够人性化。强如文件夹的开发的Form,最多也只可以实现Top3位Item的排序。如果您想实现每个Item都可以自由排序,或者灰常强大的自由组合排序的效果,那标准
  • hive官网函数-中文说明文档

    千次阅读 2020-06-11 15:36:16
    例如,对于结构foobar {int foo,int bar},foobar.foo返回存储结构的foo字段的整数。 内建功能 数学函数 Hive支持以下内置数学函数;当参数为NULL时,大多数返回NULL: 返回类型 姓名(签名) 描述 DOUBLE ...
  • JFreeChart| JFreeChart API中文文档

    千次阅读 2017-11-23 22:50:44
    void setTickMarkPosition(DateTickMarkPosition position)日期标签位置(参数常量org.jfree.chart.axis.DateTickMarkPosition类定义) CategoryAxis(Axis)类: void setCategoryMargin(double margin)分类轴...
  • 面向文档

    千次阅读 2018-02-07 14:51:38
    也许有一天你想这些对象存储数据库。使用关系型数据库的行和列存储,这相当于是一个表现力丰富的对象挤压到一个非常大的电子表格:你必须将这个对象扁平化来适应表结构--通常一个字段>对应一列--而且又...
  • 软件文档编写向导

    千次阅读 2016-08-05 11:20:40
    程序员的日常工作,除了编写代码之外,还免不了需要编写各种技术文档。一个编写良好的技术文档在项目能够很好地建立沟通与协作,起到很积极的作用。因此,编写技术文档也就成为了程序员技能提升的很重要的一面...
  • 适用于: Word 2016, Word 2013, Word 2010, Word Online, Word Starter, Word Starter ...Word 提供了用于查找文档中的特定内容的多个选项。您可以搜索和替换文本、 图像、 标题、 书签、 或某些类型的格式,如段落
  • Hibernate中文参考文档(JFIS)

    千次阅读 2007-11-05 09:57:00
    1. Tomcat快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. 第一部分 - 第一个Hibernate程序 2.2.1. 第一个class ...
  • 如何写出受技术欢迎的需求文档

    千次阅读 2018-10-31 14:49:01
    “写需求文档”说专业点是用户(或运营、客服等)的需求转化成技术部门的话语,因此了解技术术语是产品经理的基本素质。要做到需求文档受欢迎,了解术语是不够的。虽然不可能写得像开发人员写设计文档的一样专业,...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 65,007
精华内容 26,002
关键字:

怎样在文档中把日期自动排序