Java智能化办公设备卷本178份Excel新报插图

译者 | Ryoko

作者 | 纹路统计数据(ID:alltodata)

头图 | CSDN 浏览自Kunming

前不久,两个同僚有位工程项目要向党委Blancheville,当中一小部分组织工作是依照 excel 附注的每星期统计数据,按文档格式重新整理成新报载入 word。赖草!整整 178 天的量要补,假如要靠分页,何必肝到难忍,(你给我他们化解啊!) 好吧ojbk,是这时候祭出 Python 网络化了。

Java智能化办公设备卷本178份Excel新报插图1Java智能化办公设备卷本178份Excel新报插图2

此基础统计数据重新整理

具体来说让他们来看一看统计数据样品和输入文档文档格式的市场需求(敏感统计数据已做人与自然处置):原初 excel 文档 n 个头表,每一子表为的统计数据,存有无历史记录和有历史记录(职能部门数 ≥ 1,每一职能部门历史记录数 ≥ 1)三种情形,需依次重新整理成三种新报,Lembron纯文档叙述,nobres内含表单的文档文档格式。

Java智能化办公设备卷本178份Excel新报插图3Java智能化办公设备卷本178份Excel新报插图4

撸起衣领,丫!

哦不,已经开始写标识符!

先将子表制备两个,易于标准化检视每星期统计数据历史记录的规律性,也方便快捷中后期处置。采用 xlrd 库读表,以获取组织工作簿中的公益活动表名,再采用 pandas 库结点子表以分拆,dataframe 文档格式的统计数据对 excel 表的卢戈韦极佳。

defmerge_sheet(filepath):分拆多个同表头的子表wb = xlrd.open_workbook(filepath)sheets = wb.sheet_namesdf_total = pd.DataFramefor name in sheets:df = pd.read_excel(filepath, sheet_name=name)df_total = df_total.append(df)df_total.to_excel(“merge.xlsx”, index=False)
Java智能化办公设备卷本178份Excel新报插图5

输入三种新报

1、纯文档文档文档格式

依照需要输入的新报样式,输入无历史记录的新报只需读取【日期】列和【填报职能部门】列,将【填报职能部门】列为无的日期段按每星期输入即可。检视原表统计数据,直接筛选无填报历史记录的统计数据丢到命名为无的子表里。

Java智能化办公设备卷本178份Excel新报插图6

这里也可以利用.groupby对【填报职能部门】列分组,取无的那一组,可是要注意一点:虽然 Python 很强大,但不需要将所有事情都交给 Python 做。

导入库和模块如下:

importpandasaspdimport xlrdfrom docximportDocumentfrom docx.sharedimportPtfrom docx.sharedimportInchesfrom docx.oxml.nsimportqnfrom docx.enum.textimportWD_PARAGRAPH_ALIGNMENTfrom docx.enum.sectionimportWD_ORIENTATION

基本流程很简单,读入无填报历史记录的统计数据,按日期输入 word 文档文档格式。

def wu_to_word(filepath):df = pd.read_excel(filepath, sheet_name=“无”)date_list = list(df[日期])fordindate_list:filename = wordname+str(d)+“).docx”输入的word文档名title =“(“+str(d)[:4]+“.”+str(d)[4:6]+“.”+str(d)[6:8]+“)”副标题日期XXXX.XX.XXword =str(d)[:4]+“年”+str(d)[4:6]+“月”+str(d)[6:8]+“日”开头、落款日期XXXX年XX月XX日wu_doc(title, word, filename)print(f“文档:{filename},{title},{word} 已保存”)

每份文档文档格式都会用到的同样的内容也可以先设定好。

wordname = “XX公司业务统计数据表(新报” all_title = ” XX公司业务报告”

生成 word 内容,不加表单的情形下还是比较容易实现的,注意调整好文档格式。

def wu_doc(title,word,filename): 传入副标题日期,文段开头及落款的日期,文档名doc = Document 创建文档文档格式对象section = doc.sections[0] 以获取页面节点section.orientation = WD_ORIENTATION.LANDSCAPE 页面方向设为横版new_width, new_height = section.page_height, section.page_width 将原初长宽互换,实现将竖版页面变为横版section.page_width = new_widthsection.page_height = new_height段落的全局设置doc.styles[Normal].font.name = u宋体字体doc.styles[Normal]._element.rPr.rFonts.set(qn(w:eastAsia), u宋体) 中文字体需再添加这个设置doc.styles[Normal].font.size = Pt(14) 字号 四号对应14t1 = doc.add_paragraph 添加两个段落t1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER 居中_t1 = t1.add_run(all_title) 添加段落内容(大标题)_t1.bold = True 加粗_t1.font.size = Pt(22)t2 = doc.add_paragraph 再添加两个段落t2.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER 居中_t2 = t2.add_run(title +“\n”) 添加段落内容(副标题)_t2.bold = Truedoc.add_paragraph(word +“无历史记录。\n\n”).paragraph_format.first_line_indent = Inches(0.35) 添加段落同时添加内容,并设置首行缩进doc.add_paragraph(word).paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT 落款日期右对齐doc.save(dir+filename) 按路径+文档名保存

执行!104 份无填报历史记录的新报写好啦,干脆这样Blancheville吧,剩下的不想研究了哈哈哈。

Java智能化办公设备卷本178份Excel新报插图7

2、附表单文档文档格式

有报送历史记录的统计数据处置起来相对复杂一点,先看一下原初统计数据。

Java智能化办公设备卷本178份Excel新报插图8

比如 X 年 X 月 X 日,有 N 个职能部门填报了统计数据,依照文档文档格式样例,文段叙述部分需要重新整理成如下文档格式:

职能部门 A:报送内容1 X条历史记录;报送内容2 Y条历史记录;职能部门 B:……;职能部门 C:……;

而附件表单部分需重新整理成如下文档格式,可以预想把每一行需要的统计数据重新整理两个 list,按行载入表单:

一级指标二级指标三级指标四级指标各职能部门报送情形备注lalalahahahabalabala若为空则沿用上级职能部门A:报送内容1有历史记录未上传,没报,系统崩了aaabbbcccddd职能部门A:报送内容2已上传,报的好…………职能部门B:报送内容1…

基本流程类似,读表后先按日期分组,每一组含中的两个或多个职能部门统计数据,再生成某的附件需要的表单,接着重新整理文段叙述,后按日期输入每的 word 文档文档格式。

def what_to_word(filepath):df = pd.read_excel(filepath, sheet_name=“有”)df.fillna(, inplace=True) 替换nan值为空字符dates = 日期列表df_total = 分日期存的所有dflist_total = 每一份word中需要的表统计数据合集fordindf.groupby(日期):dates.append(d[0])df_total.append(d[1])forindex,dateinenumerate(dates):list_oneday = 某两个word所需的表统计数据forrowinrange(len(df_total[index])):list_row = get_table_data(df_total, index, row) 当中一行统计数据list_oneday.append(list_row)list_total.append(list_oneday)forindex,dateinenumerate(dates):filename = wordname+str(date)+“).docx”输入的word文档名title =“(“+str(date)[:4]+“.”+str(date)[4:6]+“.”+str(date)[6:8]+“)”副标题日期XXXX.XX.XXword = str(date)[:4]+“年”+str(date)[4:6]+“月”+str(date)[6:8]+“日”开头、落款日期XXXX年XX月XX日sentence = get_sentence(df_total, index) 某一天的文段叙述what_doc(title, word, sentence, list_total[index], filename) 传入需要的内容后输入文档文档格式print(f“文档:{filename} 已保存”)

下面让他们依次看一看重新整理表单、重新整理文段、输入文档文档格式是如何实现的。

重新整理表单

以获取 excel 附注的一行统计数据(说明:df_total[df_index]为两个 dataframe,其values为两个二维的 numpy 数组),重新整理各级指标、各职能部门报送情形和备注,返回两个列表。

def get_table_data(df_total, df_index, table_row):list1 = df_total[df_index].values[table_row] excel附注的一行list2 = list1[3:7] 一至四级指标fori inrange(len(list2)): 当前指标为空则沿用上级指标iflist2[i] ==and i !=0:list2[i] = list2[i –1]content = list1[2] +“:\n”+ list1[-4] 报送内容ifin list1[-2]: 备注remark =有历史记录未上传,+ str(list1[-1])else:remark =已上传list3 = list2.tolist 需填入word中的表统计数据,由numpy数组转为list列表list3.append(str(content))list3.append(str(remark))returnlist3

重新整理文段

对当日统计数据中的【填报职能部门】列中的值计数,得知有 N 个职能部门填报了统计数据。对职能部门分组,以获取其相关信息,组制备 [(报送内容,历史记录数,是否上报,备注)] 的文档格式,再重新整理出形如 有N个职能部门报送了统计数据:职能部门X: 报送内容XXX X条历史记录;… … 的叙述串。

def get_sentence(df_total, df_index):df_oneday = df_total[df_index]num = df_oneday[填报职能部门].nunique 职能部门的数量group = 职能部门名称detail = 组合某个职能部门的统计数据,当中元素为元组文档格式(, , , )info = 报送情形叙述for item in df_oneday.groupby(填报职能部门):group.append(item[0])detail.append(list(zip(list(item[1][报送内容]),list(item[1][历史记录数]),list(item[1][是否上报]),list(item[1][备注]))))for index, g in enumerate(group): 重新整理每一职能部门的填报情形mes = str(g)+: 职能部门开头for i in range(len(detail[index])):_mes = detail[index][i]if int(_mes[1])>0:mes = mes + f{_mes[0]}{_mes[1]}条历史记录;info = info + mesinfo = info[:-1]+”。” 将最后两个分号替换成句号sentence = f”有{num}个职能部门报送了统计数据:{info}”return sentence

输入文档文档格式

(耐心警告!)调整 word 中的文档和表单样式的操作比较繁琐,需一步一步设置,预设表头如下:

table_title = [一级指标, 二级指标, 三级指标, 四级指标, 各职能部门报送情形, 备注]

其他详见标识符注释。

def what_doc(title, word, sentence, table, filename): 传入副标题日期,开头/落款日期,文段,表统计数据,文档名doc = Documentsection = doc.sections[0]new_width, new_height = section.page_height, section.page_widthsection.orientation = WD_ORIENTATION.LANDSCAPEsection.page_width = new_widthsection.page_height = new_height段落的全局设置doc.styles[Normal].font.name = u宋体 字体doc.styles[Normal]._element.rPr.rFonts.set(qn(w:eastAsia), u宋体) 中文字体需再添加这个设置doc.styles[Normal].font.size = Pt(14) 字号 四号对应14t1 = doc.add_paragraph 大标题t1.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER 居中_t1 = t1.add_run(all_title)_t1.bold = True_t1.font.size = Pt(22)t2 = doc.add_paragraph 副标题t2.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER 居中_t2 = t2.add_run(title + “\n”)_t2.bold = Truedoc.add_paragraph(word + sentence +”\n\n”).paragraph_format.first_line_indent = Inches(0.35) 首行缩进doc.add_paragraph(word).paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.RIGHT 右对齐doc.add_paragraph(“各职能部门具体报送情形见附件:”)doc.add_page_break 分页—————————————————————fujian = doc.add_paragraph.add_run(“\n附件”)fujian.bold = Truefujian.font.size = Pt(16)t3 = doc.add_paragraph 附件大标题t3.paragraph_format.alignment = WD_PARAGRAPH_ALIGNMENT.CENTER 居中_t3 = t3.add_run(“XX公司业务统计数据表”)_t3.bold = True_t3.font.size = Pt(22)rows = len(table)+1word_table = doc.add_table(rows=rows, cols=6, style=Table Grid) 创建rows行、6列的表单word_table.autofit=True 添加框线table = [table_title] + table 固定的表头+表统计数据for row in range(rows): 载入表单cells = word_table.rows[row].cellsfor col in range(6):cells[col].text = str(table[row][col])for i in range(len(word_table.rows)): 结点行列,逐格修改样式for j in range(len(word_table.columns)):for par in word_table.cell(i, j).paragraphs: 修改字号for run in par.runs:run.font.size = Pt(10.5)for par in word_table.cell(0, j).paragraphs: 第一行加粗for run in par.runs:run.bold = Truedoc.save(dir+filename)

执行!74份有历史记录的新报也写好啦,一共178份。

Java智能化办公设备卷本178份Excel新报插图9

一顿操作猛如虎,总算是批量生成了新报,盒饭该加个鸡腿子了吧… …

Java智能化办公设备卷本178份Excel新报插图10

源码浏览

假如大家对文中的源码和统计数据感兴趣,电脑网页打开下方链接即可浏览

https://alltodata.cowtransfer.com/s/9c8f675d2f7544

Java智能化办公设备卷本178份Excel新报插图11Java智能化办公设备卷本178份Excel新报插图12
Java智能化办公设备卷本178份Excel新报插图13

点分享

Java智能化办公设备卷本178份Excel新报插图14
Java智能化办公设备卷本178份Excel新报插图15

作者 nasiapp

在线客服
官方客服
我们将24小时内回复。
12:01
您好,有任何疑问请与我们联系!

选择聊天工具: