一、科学计数法及修约:

此部分代码有误,更新可见:
源码内已经注释的很清楚了,

  1. import math # log10及向上修约
  2. x1 = 1000
  3. x2 = 0.0793
  4. y1 = math.log10(x1 * x2) # log10对于小数等可以明确返回相关数字。
  5. y01 = math.ceil(abs(math.log10(x1 * x2))) # math.ceil为向上取整得到小数位数。
  6. if y1 > 0:
  7. # 对于log10正数的情况↓将数字转化为科学计数法,并且执行向上修约
  8. z1 = x1 * x2 / pow(10, y01-1)#转化为整数位只有1位的数字
  9. print(z1)
  10. z2 = "{:.1f}".format(z1) # 格式化,{:1f},为格式化为小数,保留1位
  11. print(z2)
  12. if float(z1) > float(z2):
  13. #对于修约后进位的情况↓
  14. if len(str(int(z1 + 0.1))) == 2:
  15. z01 = "{:.1f}".format((z1 + 0.1) / 10) + "E+" + str(y01)
  16. else:
  17. z1 = "{:.1f}".format((float(z2) + 0.1))
  18. z01 = z1 + 'E+' + str(y01-1)
  19. #对于进位情况处理结束↑
  20. else:
  21. z01 = z2 + 'E+' + str(y01)
  22. else:
  23. # 对于log10负数的情况↓
  24. z1 = x1 * x2 * pow(10, y01)
  25. print(z1)
  26. z2 = "{:.1f}".format(z1)
  27. print(z2)
  28. if float(z1) > float(z2):
  29. if len(str(int(z1+0.1))) == 2 :
  30. z01 = "{:.1f}".format((z1 + 0.1)/10) + "E-" + str(y01-1)
  31. else:
  32. z1 = "{:.1f}".format((float(z2) + 0.1))
  33. z01 = z1 + 'E-' + str(y01)
  34. else:
  35. z01 = z2 + 'E-' + str(y01)
  36. print(z01,float(z01))

其中,x1和x2为输入的数字,y1中有x1和x2相乘的计算,这段完全可以改为读取数据计算的形式。
实现的功能是,将计算后的数字修约为只保留一位小数的科学计数法,对于修约后进位做了二次修约,修约采取向上修约,即修约末位后面位数只要存在数字,即+1,放到实例中,即为+0.1。
采取log10的计算判断小数点后0的个数。
代码未涉及负数的情况,需要的时候只需要在z01合成数字时增加“-”即可。

二、对word的操作:

1)写入有内容的表格或者空表格。

  1. for lol in df:
  2. df11 = pd.read_excel(listA[i], sheet_name=lol) # 按照sheet名读取整个sheet
  3. df11 = df11.dropna(axis=1, how="all") # 按列删除空列,例如表格有11列其中5列没有值,则删除
  4. df11 = df11.fillna("")#替换nan
  5. tt = document.add_table(df11.shape[0] + 1, df11.shape[1], style="Table Grid")#切片第1行第1
  6. document.add_paragraph(lol + "\n")
  7. for j in range(df11.shape[-1]):
  8. tt.cell(0, j).text = df11.columns[j]
  9. # add the rest of the data frame
  10. for iq in range(df11.shape[0]):
  11. for j in range(df11.shape[-1]):
  12. tt.cell(iq + 1, j).text = str(df11.values[iq, j])
  13. #导出附页2结束↑
  14. field_list = ['s1', 's2', 's3', 's4', 's5', 's6', 's7', 's8', 's9', 's10', 's11']
  15. table = document.add_table(rows=len(U2) + 1, cols=12, style="Table Grid")
  16. table.cell(0, 0).text = '项目'
  17. for iz in range(1, len(field_list) + 1):
  18. table.cell(0, iz).text = field_list[iz - 1]
  19. for jz in range(1, len(U2) + 1):
  20. table.cell(jz, 0).text = '参数' + str(jz)
  21. document.add_paragraph('xxxxx)')

2)设置字体及合并单元格

  1. font_1 = document.styles['Normal'] # 样式
  2. font_1.font.name = '思源宋体 CN' # 字体
  3. font_1.font.size = Pt(8) # 字号
  4. fk = document.add_table(df2.shape[0] + 1, df2.shape[1],style="Table Grid") # 设置表格并设置框线
  5. fk.cell(0, 0).merge(fk.cell(0, 4)) # 合并单元格
  6. run = fk.cell(0, 0).paragraphs[0].add_run('xxxx') # 写入内容
  7. run.font.name = '思源宋体 CN' # 指定单元格设定字体
  8. run.font.size = Pt(20) # 指定单元格设定字号
  9. fk.cell(0, 0).paragraphs[0].alignment = WD_PARAGRAPH_ALIGNMENT.CENTER # 居中

3)页眉页脚及分隔符

  1. document.sections[0].header.paragraphs[0].text = 'xxxx'
  2. document.sections[1].header.paragraphs[0].text = 'xxxx'
  3. #add_page_number(document.sections[0].footer.paragraphs[0])
  4. #document.sections[0].footer.paragraphs[0].alignment = WD_ALIGN_PARAGRAPH.RIGHT
  5. document.sections[0].footer.paragraphs[0].text = 'xxxx'
  6. document.sections[1].footer.paragraphs[0].text = 'xxxx'
  7. document.add_section() # 插入分节符,可当分页符用
  8. document.add_paragraph("附页2:xxxx\n")

4)import:

  1. from docx.shared import Inches, Pt
  2. from docx.oxml.ns import qn
  3. from docx import Document
  4. from docx.enum.text import WD_PARAGRAPH_ALIGNMENT#设置字符对齐docx