由于数值策划给出数值是excel表格,但前台flash程序用的又是json格式。服务器也用了json格式,而json又是utf-8编码的,用C++实现,太痛苦。
鉴于此,尝试用python实现看看。没想到,python实现确实很简单,一个多小时搞定(有搜索事半功倍啊)。
今天我又对它做了一点改进。主要1、是支持float和多表格;2、在excel中用"tablelist"描述要转的表和目标json的文件名称(如图)
。
修改后的代码:
# -*- coding: utf-8 -*-# 这段代码主要的功能是把excel表格转换成utf-8格式的json文件
# lastdate:2011-8-15 14:21 version 1.1
import os
import sys
import codecs
import xlrd #http://pypi.python.org/pypi/xlrd
if len(sys.argv) != 2 :
print "argv count != 2, program exit"
print "USAGE: a.py excelfilename"
exit(0)
print "excel to json"
excelFileName = sys.argv[1]
def FloatToString (aFloat):
if type(aFloat) != float:
return ""
strTemp = str(aFloat)
strList = strTemp.split(".")
if len(strList) == 1 :
return strTemp
else:
if strList[1] == "0" :
return strList[0]
else:
return strTemp
def table2jsn(table, jsonfilename):
nrows = table.nrows
ncols = table.ncols
f = codecs.open(jsonfilename,"w","utf-8")
f.write(u"{\n\t\"list\":[\n")
for r in range(nrows-1):
f.write(u"\t\t{ ")
for c in range(ncols):
strCellValue = u""
CellObj = table.cell_value(r+1,c)
if type(CellObj) == unicode:
strCellValue = CellObj
elif type(CellObj) == float:
strCellValue = FloatToString(CellObj)
else:
strCellValue = str(CellObj)
strTmp = u"\"" + table.cell_value(0,c) + u"\":"+ strCellValue
if c< ncols-1:
strTmp += u", "
f.write(strTmp)
f.write(u" }")
if r < nrows-2:
f.write(u",")
f.write(u"\n")
f.write(u"\t]\n}\n")
f.close()
print "Create ",jsonfilename," OK"
return
data = xlrd.open_workbook(excelFileName)
table = data.sheet_by_name(u"tablelist")
rs = table.nrows
for r in range(rs-1):
print table.cell_value(r+1,0), "==>", table.cell_value(r+1,2)
desttable = data.sheet_by_name(table.cell_value(r+1,0))
destfilename = table.cell_value(r+1,2)
table2jsn(desttable,destfilename)
print "All OK"