xlsx批量转为utf8的csv

(金庆的专栏)

策划的配置表为 xlsx 表格,可以有注释,公式。
服务器和客户端使用的配置文件需要转成 csv 文件。
使用 WPS 另存无法批量转换,并且结果不是utf8编码的,还需要用Notepad++转编码。

除了 xlsx 转为 csv, 其他格式文件保持原样,如 *.ini, *.xml, *.lua.
server/ 子目录特殊处理,不能复制到客户端。

用python脚本实现,依赖 openpyxl 库。

#!/usr/bin/env python
# coding: utf-8
# datatab.py
# 从策划配置表目录 game\Design\配置表\”
#   生成服务器的 game\Program\server\six\datatab\” 目录,
#   和客户端的 game\Program\client\Assets\Config\” 目录。
#   所有xlsx文件生成csv文件,其他文件原样复制。
#   其中 server\ 目录特殊处理,仅对服务器有效,客户端跳过。
#
# 依赖openpyxl库:http://openpyxl.readthedocs.org/en/latest/
# 参考代码 http://segmentfault.com/q/1010000003006437?_ea=273128
# 测试环境:Python3.4

# Usage: datatab.py <game dir>
# Example: datatab.py "d:\game"
# <game dir> 是根目录,包含Design/, Program/ 目录。

from openpyxl import Workbook
from openpyxl.compat import range
from openpyxl.cell import get_column_letter
from openpyxl import load_workbook
import csv
import os
import sys
import shutil

def xlsx2csv(filename):
    # try:
        xlsx_file_reader = load_workbook(filename = filename, data_only = True)
        for sheet in xlsx_file_reader.get_sheet_names():
            # 仅第1个sheet输出到一个csv文件中,文件名后缀替换为.csv
            csv_filename = os.path.splitext(filename)[0] + '.csv'
            csv_file = open(csv_filename, 'w', encoding='utf8', newline='')
            csv_file_writer = csv.writer(csv_file)
            sheet_ranges = xlsx_file_reader[sheet]
            for row in sheet_ranges.rows:
                row_container = []
                for cell in row:
                    row_container.append(cell.value)
                csv_file_writer.writerow(row_container)
            # End of for row.
            csv_file.close()
            break  # 仅输出第1个sheet
        # End of for sheet.
    # End of try.
    # except Exception as e:
    #    print(e)
# End of xlsx2csv().

def datatab_convert(game_dir):
    '''从 game\Design\配置表\ 输出到
      game\Program\server\six\datatab\
      game\Program\client\Assets\Config\
    '''
    design_dir = os.path.join(game_dir, 'Design/配置表/')
    server_dir = os.path.join(game_dir, 'Program/server/six/datatab/')
    client_dir = os.path.join(game_dir, 'Program/client/Assets/Config/')
    
    # 删除旧文件。
    print("Delete " + server_dir)
    try:
        shutil.rmtree(server_dir)
    except:
        pass
    print("Delete " + client_dir)
    try:
        shutil.rmtree(client_dir)
    except:
        pass    

    # 生成server文件
    print("Creating " + server_dir)
    shutil.copytree(design_dir, server_dir)
    files = get_files(server_dir)
    convert_files(files)
    
    # 复制client文件
    print("Copy " + client_dir)
    shutil.copytree(server_dir, client_dir)
    shutil.rmtree(os.path.join(client_dir, 'server/'))
    print("Done. Total files: %d" % len(files))
# End of datatab_convert().    

def get_files(dir):
    '''Get a list of files under input dir.'''
    result = []
    for root,dirs,files in os.walk(dir):
        for f in files:
            result.append(os.path.join(root, f))
    return result
# End of get_files().            

def convert_files(files):
    '''转换一批文件.
    files 是列表,元素为完整路径名。
    '''
    for f in files:
        ext = os.path.splitext(f)[1].lower()
        if '.xlsx' != ext:
            print(f + " -> keep")
            continue
        print(f + " -> csv")
        xlsx2csv(f)
        os.remove(f)
# End of convert_files().        

if __name__ == '__main__':
    if len(sys.argv) != 2:
        print('usage: datatab <game dir>')
    else:
        datatab_convert(sys.argv[1])
    sys.exit(0)

# Usage: datatab.py <game dir>
# Example: datatab.py "d:\game"
# <game dir> 是SVN根目录,包含Design/, Program/ 目录。

为方便使用,将datatab.py 打包成 exe, 这样不能安装Python就能运行。
下载并安装Python3, 安装openpyxl包,保证本地可以运行 datatab.py.
下载并安装PyInstaller:
    pip install pyinstaller
运行
    pyinstaller --onefile datatab.py

ImportError: No module named 'jdcal'
可能openpyxl安装时自带的jdcal无法找到,删除
C:\Python34\Lib\site-packages\jdcal-1.0-py3.4.egg
重新安装:pip install jdcal

xlsx批量转为utf8的csv的更多相关文章

  1. R语言︱用excel VBA把xlsx批量转化为csv格式

    笔者寄语:批量读取目前看到有以下几种方法:xlsx包.RODBC包.批量转化成csv后读入.本章来自博客:http://www.cnblogs.com/weibaar/p/4506144.html 在 ...

  2. 批量将Java源代码文件的编码从GBK转为UTF-8

    主要参考: http://blog.csdn.net/liu_qiqi/article/details/38706497 使用common io批量将java编码从GBK转UTF-8 http://w ...

  3. Eclipse:批量将Java源代码文件的编码从GBK转为UTF-8

    很简单的几行代码,就可以批量将GBK格式的java文件转为UTF-8格式. 基本上所有文本文件的编码转换都可以采用这种方式. import java.io.File; import java.io.I ...

  4. 将汉字转为UTF-8编码

    01./** 02. * 将文件名中的汉字转为UTF8编码的串,以便下载时能正确显示另存的文件名. 03. * @param s 原文件名 04. * @return 重新编码后的文件名 05. */ ...

  5. java 将GBK编码文件转为UTF-8编码

    需要commons-io-2.0.1.jar public class Test { public static void main(String args[]) throws IOException ...

  6. php将unicode编码转为utf-8方法

    介绍 在前端开发中,为了让中文在不同的环境下都能很好的显示,一般是将中文转化为unicode格式,即\u4f60,比如:"你好啊"的 unicode编码为"\u4f60\ ...

  7. 解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG

    解决 Excel 打开 UTF-8 编码 CSV 文件乱码的 BUG zoerywzhou@163.com http://www.cnblogs.com/swje/ 作者:Zhouwan 2017-6 ...

  8. String 字符串中含有 Unicode 编码时,转为UTF-8

    1.单纯的Unicode 转码 String a = "\u53ef\u4ee5\u6ce8\u518c"; a = new String(a.getBytes("UTF ...

  9. php字符编码转换之gb2312转为utf8(转)

    在php中字符编码转换我们一般会用到iconv与mb_convert_encoding进行操作,但是mb_convert_encoding在转换性能上比iconv要差很多哦.string iconv ...

随机推荐

  1. 初学servlet之使用web.xml配置

    先写两个servlet,之后展示web.xml配置 package app01c;import java.io.IOException;import java.io.PrintWriter;impor ...

  2. [bzoj4161]Shlw loves matrix I

    来自FallDream的博客,未经允许,请勿转载,谢谢. 给定数列 {hn}前k项,其后每一项满足 hn = a1*h(n-1) + a2*h(n-2) + ... + ak*h(n-k) 其中 a1 ...

  3. Linux设备树语法详解【转】

    转自:http://www.cnblogs.com/xiaojiang1025/p/6131381.html 概念 Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离.在设备 ...

  4. Python【第四课】 装饰器

    本篇内容 什么是装饰器 装饰器需要遵循的原则 实现装饰器的知识储备 高阶函数 函数嵌套 闭包函数 无参函数 装饰器示例 1.什么是装饰器 器即函数 装饰即修饰,意指为其他函数添加新功能 装饰器定义:本 ...

  5. java的迭代器详解

    迭代器的引出 在jdk1.5版本之前是没有 foreach的,然而1.5版本就加上了foreach,而引入的新的foreach功能并不是在jvm上进行改进的因为代价太高,甲骨文工程师想到了一个比较好的 ...

  6. jvm(三):对象

    关于对象,我们需要面对的问题主要有对象的创建,对象在内存中的布局,对象的结构,对象的访问定位. 对象的创建 对象的创建过程如下图所示: 其主要步骤有:给对象分配内存,初始化对象,执行构造方法. 在对象 ...

  7. 你知道src、url、href的全称吗?

    url:Uniform Resource Locator统一资源定位符 src:Source资源 href:Hypertext Reference超文本引用

  8. Linux常用命令大全(归类)

    最近都在和Linux打交道,这方面基础比较薄弱的我只好买了本鸟哥的书看看,感觉还不错.我觉得Linux相比windows比较麻烦的就是很多东西都要用命令来控制,当然,这也是很多人喜欢linux的原因, ...

  9. 算法二叉搜索树之AVL树

    最近学习了二叉搜索树中的AVL树,特在此写一篇博客小结. 1.引言 对于二叉搜索树而言,其插入查找删除等性能直接和树的高度有关,因此我们发明了平衡二叉搜索树.在计算机科学中,AVL树是最先发明的自平衡 ...

  10. MySQL/MariaDB 在插入数据的时候提示 Incorrect string value

    现象 今天开新工程,建表的时候弹出这玩意: what's this? 看起来好像是说我传入的内容不对? 可是仔细看看内容,没乱码,标准的中文字符串.想来是编码问题. 经过修改编码后,解决了问题. 解决 ...