cocos creator:xmlbuilder:创建复杂的XML文件,node-xlsx:创建复杂的excel 文件

最近需要用cocos creator 开发一个方便策划使用的工具,该工具可以右键导出xml表或excel表。

这里只讲xmlbuilder和node-xlsx的使用方法以及如果创建对应的表格。

一、导入插件

代码如下:

// packageName为自定义的名字
let nodeXlsx = Editor.require('packages://' + packageName + '/node_modules/node-xlsx');
var xmlbuilder = Editor.require('packages://' + packageName + '/node_modules/xmlbuilder');

二、node-xlsx 创建excel表

1、创建excel表格

(1)代码如下
// 路线ID	关卡  事件ID	下个路线ID 难度模式  章节ID   地图位置  大关卡 关卡标题
// node_id  node_type	event_id	next_node_id	mode	chapter_id pos is_big  checkpoint_title
let datas = [] // 其实最后就是把这个数组写入excel 
let title = ["路线ID", "关卡", "事件ID", "下个路线ID", "难度模式", "章节ID", "x", "y", "大关卡", "关卡标题"];//这是第一行 俗称列名
datas.push(title) // 添加完列名 下面就是添加真正的内容了


for (let key = 0; key < saveChildrenData.length; key++) {
    const jointItem = saveChildrenData[key];
    let rowData = [];

    rowData.push(jointItem.node_id);
    let node_type =  jointItem.getNodeTypeString();
    rowData.push(node_type);
    rowData.push(jointItem.event_id);
    rowData.push(jointItem.next_node_id);
    rowData.push(jointItem.mode);
    rowData.push(jointItem.chapter_id);
      
    rowData.push(jointItem.node.x);
    rowData.push(jointItem.node.y);
    rowData.push(jointItem.is_big);
    rowData.push(jointItem.checkpoint_title)
        
    datas.push(rowData)
}

let buffer = nodeXlsx.build([
    {
       name: '主线副本路线',
       data: datas
    }
]);
(2)代码详解

 2、保存excel表

(1)代码如下
fs.writeFile(reddotSaveComponent.excelFilePath + "/chapter_data.excel", buffer, function (error) {
	if (error) {
        Editor.log('生成失败,有可能excel文件在wps中正在使用');
	} else {
		Editor.log(cc.js.formatStr("生成excel成功:文件位置为%s%s",reddotSaveComponent.excelFilePath,"/chapter_data.excel") );
	}
});
(2)代码详解

三、xmlbuilder 创建xml表

1、创建xml表格

(1)代码如下:
        let title = ["路线ID", "关卡", "事件ID", "下个路线ID", "难度模式", "章节ID", "x", "y", "大关卡", "关卡标题"];//这是第一行 俗称列名

        var root = xmlbuilder.create('Workbook',{ version: '1.0' })
        root.com('主线副本路线');
        root.att('xmlns', 'urn:schemas-microsoft-com:office:spreadsheet')
        root.att('xmlns:o', 'urn:schemas-microsoft-com:office:office')
        root.att('xmlns:x', 'urn:schemas-microsoft-com:office:excel')
        root.att('xmlns:ss', 'urn:schemas-microsoft-com:office:spreadsheet')


        // 加一个Styles居中组件,方便策划查看
        var Styles = root.ele('Styles');
        var Style1 = Styles.ele('Style');
        Style1.att("ss:ID","Default");
        Style1.att("ss:Name","Normal");
        var Style2 = Styles.ele('Style');
        Style2.att("ss:ID","s50");
        var Alignment = Style2.ele('Alignment');
        Alignment.att("ss:Horizontal","Center");

        var Worksheet = root.ele('Worksheet');
        Worksheet.att('ss:Name', "主线副本路线");

        var Table = Worksheet.ele('Table');
        Table.att('ss:ExpandedColumnCount', 12);
        Table.att('ss:ExpandedRowCount', 102)
        Table.att('x:FullColumns', 1)
        Table.att('x:FullRows', 1)
        Table.att('ss:DefaultColumnWidth', '70')
        Table.att('ss:DefaultRowHeight', '20')

        var setCell = function(i,row,type,value) {
            let Cell = row.ele('Cell');
            Cell.att("ss:StyleID","s50");
            let Data = Cell.ele('Data');
            Data.att('ss:Type',type);
            Data.txt(value);
            if (i != 0) {
                Data.up();
                Data.up();
            } 
        }

        //第一行
        var Row1 = Table.ele('Row');
        for (let i = 0; i < title.length; i++) {
            setCell(i,Row1,'String',title[i]);
        }

        for (let key = 0; key < saveChildrenData.length; key++) {
            const rowData = saveChildrenData[key];
            let Row = Table.ele('Row');
            let obj_data =[
                            {type:"Number",value : rowData.node_id},
                            {type:"String",value : rowData.getNodeTypeString()},
                            {type:"Number",value : rowData.event_id},
                            {type:"Number",value : rowData.next_node_id},
                            {type:"Number",value : rowData.mode},
                            {type:"Number",value : rowData.chapter_id},
                            {type:"Number",value : rowData.node.x},
                            {type:"Number",value : rowData.node.y},
                            {type:"Number",value : rowData.is_big},
                            {type:"String",value : rowData.checkpoint_title}];

            for (let i = 0; i < obj_data.length; i++) {
                let v = obj_data[i];
                setCell(i,Row,v.type,v.value);
            }
        }
        root.end({pretty: true});
(2)代码详解

2、生成xml文件

//写入文件    1.文件路径、文件名称    2.文件字符串
fs.writeFile(reddotSaveComponent.excelFilePath + "/chapter_data.xml", root.toString(), function (error) {
	if (error) {
          Editor.log('生成失败,有可能xml文件在wps中正在使用');
	} else {
		Editor.log(cc.js.formatStr("生成xml成功:文件位置为%s%s",reddotSaveComponent.excelFilePath,"/chapter_data.xml") );
	}
});

xml生成文件展示:

excel就不展示了,表格效果和xml一模一样。

如果帮到你,请评论或者点赞一下,感谢。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
cocos creator中,使用动态添加button时,如果出现"getcomponent: type must be non-nil error @ debu"错误信息,通常是因为获取组件时传入的类型为空。 要解决这个问题,首先要确定错误出现的具体代码位置,然后检查相关代码中的类型参数。 在动态添加button的代码中,通常会使用`getComponent`方法来获取button节点上的组件。例如: ```javascript var btnNode = new cc.Node(); var button = btnNode.addComponent(cc.Button); var buttonComp = btnNode.getComponent(cc.Button); // 这行代码可能出现错误 ``` 在上述代码中,如果`cc.Button`参数传递为空,即`buttonComp`的类型参数为空,就会触发错误并显示"getcomponent: type must be non-nil error"。 为了解决这个问题,我们需要确保传递给`getComponent`的类型参数不为空。在上述代码中,可以使用`cc.Button`作为参数传递给`getComponent`来获取button节点上的按钮组件。修正代码如下: ```javascript var btnNode = new cc.Node(); var button = btnNode.addComponent(cc.Button); var buttonComp = btnNode.getComponent(cc.Button); // 修正后的代码 ``` 这样修正后的代码就不会再出现"getcomponent: type must be non-nil error"错误。 总结起来,当在cocos creator中动态添加button节点时遇到"getcomponent: type must be non-nil error"错误,需要检查获取节点上组件的类型参数是否为空。修正时务必确保参数不为空,这样就能避免这个错误的出现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值