帆软报表查询某字段是否存在,并输出到excel


需求:

  • 有时候mysql某个数据表不再使用或者修改,则需要在一堆报表里(通常有几百或者上千个)找出来使用这个数据表的所有报表并进行修改,我们不可能一个个的去点开来看里面的sql有没有,可以通过python进行快速查找,节约时间。

    思路

  • 帆软报表文件通常以.cpt结尾,.frm文件不考虑。

  • 可以通过OS包来循环查找文件夹下每一个文件,将文件名记录在list里,通过pandas包来输出到excel。

  • 软件可以使用anaconda里的自带的VS CODE,这样就不用在本地环境下载pandas等包了,下载速度实在是太慢了。

    实现

    步骤1:实现循环读取文件名

  • 实现循环读取文件的名称;

  • 使用os.walk() 方法,详细使用见 https://www.runoob.com/python/os-walk.html

  • 路径要用r来标识是路径url;
    ```python
    import os

path = r’D:\softwares\FineReport_10.0\webapps\webroot\WEB-INF\reportlets’
findstring = ‘sp_product’

for root, dirs, files in os.walk(path):
for name in files:
if name.endswith(‘.cpt’):
filepath = open(os.path.join(root, name), ‘r’, encoding=’utf-8’)
if findstring in filepath.read():
print(filepath.name.replace(path, ‘’))


- 上面的输出是 \a\b\c.cpt  这种格式的
### 步骤2:优化

- 不符合网址的左斜杠要求,而第一个字符右斜杠是不需要的,我们要去掉,改一下最后一句,在最后加上替换;
```python
.replace('\\','/') 
  • 把print里的数据改为一个单独的list字段,看起来清楚些;
  • 利用切片功能去掉第一个字符;
    ```python
    import os

path = r’D:\softwares\FineReport_10.0\webapps\webroot\WEB-INF\reportlets’
findstring = ‘sp_product’
liststring = []

for root, dirs, files in os.walk(path):
for name in files:
if name.endswith(‘.cpt’):
filepath = open(os.path.join(root, name), ‘r’, encoding=’utf-8’)
if findstring in filepath.read():
filename = filepath.name.replace(path, ‘’).replace(‘\‘,’/‘)
liststring.append(filename[1:])
print(liststring)


- 上面的输出结果是 ['a/b/c.cpt'] 这种格式的,接下来就是存储到excel里了;
### 步骤3:存储到excel

- 利用pandas包的to_excel来输出到excel里;
- 文件路径的 **D:\files\ **可以去掉,这样就是相对路径了,文件会生成在当前目录下;
```python
import os
import pandas as pd

path = r'D:\softwares\FineReport_10.0\webapps\webroot\WEB-INF\reportlets'
findstring = 'sp_product'
liststring = []

for root, dirs, files in os.walk(path):
    for name in files:
        if name.endswith('.cpt'):
            filepath = open(os.path.join(root, name), 'r', encoding='utf-8')
            if findstring in filepath.read():
                filename = filepath.name.replace(path, '').replace('\\','/') 
                liststring.append(filename[1:])
                #print(liststring)

df = pd.DataFrame(liststring,columns=['报表名称'])
excelname = r"D:\files\帆软报表中存在"+findstring+"数据的文件名称.xlsx"
df.to_excel(excelname,index=False)
print("输出到excel成功!")

步骤4:优化

  • 实际上,没有查找到数据的话,并不需要输出excel;
  • 文件名最好带上当前日期,方便识别;
  • 今天查询是** datetime包的today= datetime.date.today()** ,不过要转换为字符串;
    ```python
    import os
    import pandas as pd
    import datetime

path = r’D:\softwares\FineReport_10.0\webapps\webroot\WEB-INF\reportlets’
findstring = ‘sp_product’
liststring = []

for root, dirs, files in os.walk(path):
for name in files:
if name.endswith(‘.cpt’):
filepath = open(os.path.join(root, name), ‘r’, encoding=’utf-8’)
if findstring in filepath.read():
filename = filepath.name.replace(path, ‘’).replace(‘\‘,’/‘)
liststring.append(filename[1:])
#print(liststring)

if len(liststring)==0:
print(“未找到此字段!”)
else :
today= datetime.date.today()
df = pd.DataFrame(liststring,columns=[‘报表名称’])
excelname = r”D:\files\帆软报表中存在”+findstring+”数据的文件名称-“+today.strftime(‘%Y-%m-%d’)+”.xlsx”
df.to_excel(excelname,index=False)
print(“输出到excel成功!”)

### 步骤5:检测是否有bug

- 目前看来暂无bug;
- 是否有其他优化点:当然是有的,比如写成几个函数,文件路径判断,等等,这个由于是自己用的,就不用这么麻烦了。

文章作者: 洛神葵
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 洛神葵 !
评论
  目录