使用Python读取Google Spreadsheet的内容并写入到mangodb

本文介绍了使用Python将Google Spreadsheet中的数据同步到MongoDB的方法。作者因网站数据量不大,决定尝试用Google Spreadsheet保存数据。借助Google Spreadsheets API,在Python环境下进行操作,获取文档key并访问内容,最后将内容写入MongoDB。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

昨天突发奇想, 现在google docs里的spreadsheet很强大, 如果我的网站数据不是很大, 那么我通过spreadsheet来保存我的数据不是一件很方便的事情吗, 事实上, 我的网站也只是保存一些产品的数据, 而我的产品又不可能像eBay那样有许多, 那么我就试试把数据保存在Google Spreadsheet里吧。 

目标有了, 工具呢? 去看看Google Spreadsheets API吧, 嗯, 它还躺在Google Labs里面, 不过也还不错, 那么它支持那些语言呢?因为我对Python很有爱, 而且这个API也支持Python, perfect!!! 好了, 开始动手。 如果要使用这个API, 那么第一步自然是下载一个叫Google Python Client Library东西。 使用这个client的前提是你要有Python的环境, 并且包含httplib和urllib这两个模块, 还好python2.6都内置了这两个模块, 如果你使用2.6这个版本的话, 直接从上面这个link下载, 安装就好了。 

 python setup.py install

进入python, 我们做一些简单的实验。

>>>   import  gdata.spreadsheet.service as service
>>>  client  =  service.SpreadsheetsService()
>>>  client.email  =   " yourgoogleaccount@domain.com "    # 你的app帐号或者gmail帐号
>>>  client.password  =   " ******** "    # 这个就是密码的东西, 你当然看不见了
>>>  client.source  =   " iMaQ-Documents-v1 "   # 这个不好解释, 下面大概描述一下
>>>  client.ProgrammaticLogin()  # 利用上面的信息登陆到Google

嗯, 很好, 我in了 xD, 接下来, 我要知道我的Documents里有哪些spreadsheet, 废话, 我当然知道, 我可以直接进到我的documents里去看我有哪些表格, 我们就以里面自带的一个demo的文档做实验, 那个叫做internal-Contact的东东。 首先如果要访问这个文档的话, 我们要知道这个文档的key

>>>  docs  =  client.GetSpreadsheetsFeed()
>>>   for  i, entry  in  enumerate(docs.entry):
...     
print  entry.title.text , entry.id.text
... 
internal 
-  Contact http: // spreadsheets.google.com / feeds / spreadsheets / private / full / blablablabla__Y1ax999C
products http:
// spreadsheets.google.com / feeds / spreadsheets / private / full / blablablablabla_Z1fSm - nXQ
>>>

 看到了吗? 列出了两个我这个帐号可以访问的文档, entry.title.text就是文档的名字, entry.id.text就是这个文档的feed地址, 是你后面调用api的时候直接访问这个文档的地址, 里面的/full/后面的一串blablabla就是这个文档的key. 有了这个key, 我们就可以直接去访问这个文档里的内容啦, 首先看看这个表格里有几个sheet。

>>>  sheet  =  client.GetWorksheetsFeed(key)
>>>   for  i, entry  in  enumerate(sheet.entry):
...     
print  entry.title.text, entry.id.text
... 
Sheet1 http:
// spreadsheets.google.com / feeds / worksheets / blablablablabla__Y1ax999C / private / full / od1
>>>

 结果给出只有一个Sheet1, 后面的那个是workbook的key和这个sheet的id, 这里是od1, 现在我们就可以去看看这个sheet里的内容了

>>>  table  =  client.GetListFeed(key,wksht_id)
>>>   for  i, entry  in  enumerate(table.entry):
...     
for  column  in  entry.custom:
...             
print   " [%s:%s] " % (column, entry.custom[column].text)
... 
[comment:I
' m commenting on this contact form]
[timestamp: 2 / 15 / 2010   8 : 07 : 30 ]
[name:Sarah]
[email:garsides@gmail.com]
[comment:I want to join the group.]
[timestamp:
2 / 15 / 2010   13 : 06 : 33 ]
[name:Larisa]
[email:info@landviser.com]
[comment:
is  it wotk]
[timestamp:
2 / 15 / 2010   17 : 23 : 55 ]
[name:Larisa]
[email:info@landviser.com]
[comment:Test]
[timestamp:
2 / 16 / 2010   12 : 17 : 22 ]
[name:Jeremy]
... 
# 后面的省略掉了

内容都出来了, 好多阿 - . -!

 

看来访问内容还是很容易的, 接下来, 我们就可以把内容写到可爱的mongodb里 去了, 如何使用mongodb就不是本文所涉及的主题了, 既然内容已经被都出来了, 你可以将这些内容写到你喜欢的地方去, big table, mysql, oracle, 或者txt里。 使用mongodb的前提是你已经有了mongo的环境并且装好了python driver, 叫pymongo, 那么下面就接着继续

>>>   from  pymongo  import  Connection
>>>  db  =  Connection( " localhost " ).test.contacts
>>>   for  i, entry  in  enumerate(table.entry):
...     obj 
=  {}
...     
for  col  in  entry.custom:
...             obj[col] 
=  entry.custom[col].text
...     db.save(obj)
... 
ObjectId(
' 4c2f9bad092ce508b2000000 ' )
ObjectId(
' 4c2f9bad092ce508b2000001 ' )
ObjectId(
' 4c2f9bad092ce508b2000002 ' )
ObjectId(
' 4c2f9bad092ce508b2000003 ' )
ObjectId(
' 4c2f9bad092ce508b2000004 ' )
ObjectId(
' 4c2f9bad092ce508b2000005 ' )
ObjectId(
' 4c2f9bad092ce508b2000006 ' )
ObjectId(
' 4c2f9bad092ce508b2000007 ' )
ObjectId(
' 4c2f9bad092ce508b2000008 ' )
ObjectId(
' 4c2f9bad092ce508b2000009 ' )
ObjectId(
' 4c2f9bad092ce508b200000a ' )
ObjectId(
' 4c2f9bad092ce508b200000b ' )
ObjectId(
' 4c2f9bad092ce508b200000c ' )
...

 好了, 刚才那个contacts里的内容就写到mongodb里去了, 你可以进到mongo的console里去

use test
db.contacts.find()

 

 

转载于:https://www.cnblogs.com/Stephen/archive/2011/03/06/python-sync-gspreadsheet-mongodb.html

<think>我们使用Python读取Excel文件输出到浏览器,通常有两种场景: 1. 将Excel数据以网页表格形式展示(纯数据展示) 2. 将Excel数据导出为文件供用户下载(文件下载) 这里我们主要讨论第一种场景:将Excel数据读取后,在浏览器中以HTML表格形式展示。 步骤: 1. 使用Python库(如pandas)读取Excel文件 2. 将数据转换为HTML表格字符串 3. 使用Web框架(如Flask)将HTML字符串发送到浏览器 示例使用Flask框架: 安装所需库: ```bash pip install pandas flask openpyxl ``` 代码示例(app.py): ```python from flask import Flask, render_template_string import pandas as pd app = Flask(__name__) @app.route('/') def show_excel(): # 读取Excel文件(假设文件名为data.xlsx,位于当前目录) df = pd.read_excel('data.xlsx') # 将DataFrame转换为HTML表格字符串 html_table = df.to_html(classes='table table-striped', index=False) # 构建完整的HTML页面 html_content = f""" <!DOCTYPE html> <html> <head> <title>Excel数据展示</title> <!-- 引入Bootstrap样式 --> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> </head> <body> <div class="container mt-3"> <h2>Excel数据</h2> {html_table} </div> </body> </html> """ return render_template_string(html_content) if __name__ == '__main__': app.run(debug=True) ``` 说明: 1. 使用`pd.read_excel`读取Excel文件,得到一个DataFrame。 2. 使用`to_html`方法将DataFrame转换为HTML表格字符串。参数`classes`用于给表格添加CSS类(这里使用了Bootstrap的样式),`index=False`表示不显示行索引。 3. 使用Flask的`render_template_string`渲染包含表格的HTML页面。为了美观,我们引入了Bootstrap的CSS。 运行程序后,访问http://localhost:5000即可看到展示的表格。 如果需要处理更复杂的Excel文件(如包含多个工作表),可以修改读取部分: ```python # 读取所有工作表 xls = pd.ExcelFile('data.xlsx') sheet_names = xls.sheet_names # 然后可以循环读取每个工作表,在页面上展示多个表格 ``` 对于第二种场景(文件下载): 我们可以将Excel文件直接作为静态文件提供,或者动态生成Excel文件提供下载链接。这里提供一个动态生成下载链接的示例: ```python from flask import send_file @app.route('/download') def download_excel(): # 假设我们有一个Excel文件需要提供下载 path = 'data.xlsx' return send_file(path, as_attachment=True) ``` 或者动态生成Excel文件下载(使用pandas): ```python from io import BytesIO @app.route('/download') def download_excel(): # 创建一个DataFrame(或从数据库读取数据) df = pd.DataFrame({'A': [1,2,3], 'B': [4,5,6]}) # 将DataFrame写入内存中的Excel文件 output = BytesIO() with pd.ExcelWriter(output, engine='openpyxl') as writer: df.to_excel(writer, index=False, sheet_name='Sheet1') output.seek(0) return send_file(output, download_name='export.xlsx', as_attachment=True, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet') ``` 注意:动态生成Excel文件需要安装openpyxl库。 以上两种场景分别对应了读取Excel在浏览器中展示和提供下载功能。 如果用户的需求是读取Excel文件直接在浏览器中显示(不通过Web框架),那么通常是指通过命令行脚本运行后,在命令行中展示表格数据。但这样无法直接在浏览器中显示。因此,我们假设用户需要的是Web应用。 相关问题: 1. 如何读取Excel中的多个工作表在网页中分开展示? 2. 如何将网页中的表格数据导出为Excel文件? 3. 如何读取Excel中的图片在网页中显示? 4. 如何处理大型Excel文件(避免内存不足)? 5. 如何实现Excel文件上传实时展示数据?</think># Python读取Excel文件输出到浏览器 我将详细介绍如何使用Python读取Excel文件将数据输出到浏览器中显示。整个过程分为三个主要步骤:读取Excel文件、数据处理和转换、浏览器输出。 ## 整体解决方案 ```python import pandas as pd from flask import Flask, render_template_string, send_file import io app = Flask(__name__) @app.route('/') def display_excel(): # 1. 读取Excel文件 df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 2. 数据处理和转换 # 添加样式类用于表格展示 styled_df = df.head(20).style.set_table_attributes( 'class="table table-striped table-bordered table-hover"' ).set_table_styles([{ 'selector': 'th', 'props': [('background-color', '#f8f9fa'), ('color', '#495057')] }]) # 3. 输出到浏览器 html_content = f""" <!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Excel数据浏览器展示</title> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/css/bootstrap.min.css" rel="stylesheet"> <style> body {{ padding: 20px; background-color: #f5f7fa; }} .container {{ max-width: 1200px; margin: 0 auto; }} .header {{ background: linear-gradient(135deg, #6a11cb 0%, #2575fc 100%); color: white; padding: 20px; border-radius: 8px; margin-bottom: 25px; }} .table-container {{ background: white; border-radius: 8px; box-shadow: 0 0.5rem 1rem rgba(0,0,0,.15); padding: 20px; overflow-x: auto; }} h1 {{ font-weight: 600; }} .stats-card {{ background: white; border-radius: 8px; padding: 15px; box-shadow: 0 0.125rem 0.25rem rgba(0,0,0,.075); }} .stat-value {{ font-size: 1.8rem; font-weight: 700; color: #2575fc; }} .download-btn {{ background: #6a11cb; border: none; }} .download-btn:hover {{ background: #4d0ca1; }} </style> </head> <body> <div class="container"> <div class="header text-center"> <h1><i class="bi bi-file-earmark-spreadsheet"></i> Excel数据浏览器展示</h1> <p class="lead">使用Python Flask和Pandas实时读取展示Excel数据</p> </div> <div class="row mb-4"> <div class="col-md-3 mb-3"> <div class="stats-card text-center"> <div class="stat-value">{len(df)}</div> <div class="stat-label">总记录数</div> </div> </div> <div class="col-md-3 mb-3"> <div class="stats-card text-center"> <div class="stat-value">{len(df.columns)}</div> <div class="stat-label">总列数</div> </div> </div> <div class="col-md-3 mb-3"> <div class="stats-card text-center"> <div class="stat-value">{df.isnull().sum().sum()}</div> <div class="stat-label">空值总数</div> </div> </div> <div class="col-md-3 mb-3"> <div class="stats-card text-center"> <div class="stat-value">{df.duplicated().sum()}</div> <div class="stat-label">重复记录</div> </div> </div> </div> <div class="table-container"> <div class="d-flex justify-content-between align-items-center mb-3"> <h3>数据预览(前20行)</h3> <a href="/download" class="btn download-btn"> <i class="bi bi-download"></i> 下载完整数据 </a> </div> {styled_df.to_html()} </div> <div class="mt-4 text-center text-muted"> <p>数据更新时间: {pd.Timestamp.now().strftime('%Y-%m-%d %H:%M:%S')}</p> </div> </div> <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.1.3/dist/js/bootstrap.bundle.min.js"></script> </body> </html> """ return render_template_string(html_content) @app.route('/download') def download_excel(): # 读取原始Excel文件 df = pd.read_excel('data.xlsx') # 创建内存中的Excel文件 output = io.BytesIO() with pd.ExcelWriter(output, engine='openpyxl') as writer: df.to_excel(writer, index=False, sheet_name='数据') output.seek(0) return send_file( output, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', download_name='exported_data.xlsx', as_attachment=True ) if __name__ == '__main__': app.run(debug=True) ``` ## 实现步骤详解 ### 1. Excel文件读取 使用Pandas库读取Excel文件是最简单高效的方法: ```python import pandas as pd # 读取Excel文件 df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 查看数据结构 print(f"行数: {len(df)}, 列数: {len(df.columns)}") print(f"列名: {list(df.columns)}") ``` Pandas支持多种读取选项: - `sheet_name`: 指定工作表名称或索引 - `header`: 指定标题行位置 - `usecols`: 选择特定列 - `dtype`: 指定列数据类型 - `na_values`: 定义空值标识 ### 2. 数据处理与转换 在输出到浏览器前,通常需要对数据进行预处理: ```python # 处理空值 df.fillna('N/A', inplace=True) # 转换日期格式 date_columns = ['birth_date', 'order_date'] for col in date_columns: if col in df.columns: df[col] = pd.to_datetime(df[col]).dt.strftime('%Y-%m-%d') # 添加样式用于表格展示 styled_df = df.head(20).style \ .set_table_attributes('class="table table-striped"') \ .format({'salary': '${:,.2f}'}) \ .background_gradient(subset=['sales'], cmap='Blues') ``` ### 3. 浏览器输出技术 使用Flask框架创建Web应用输出数据: #### 方法1:HTML表格展示 ```python from flask import Flask, render_template_string app = Flask(__name__) @app.route('/') def show_data(): df = pd.read_excel('data.xlsx') return render_template_string(df.to_html(classes='table table-striped')) ``` #### 方法2:提供下载链接 ```python from flask import send_file import io @app.route('/download') def download(): # 创建内存中的Excel文件 output = io.BytesIO() df.to_excel(output, index=False) output.seek(0) return send_file( output, mimetype='application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', download_name='data_export.xlsx', as_attachment=True ) ``` #### 方法3:JSON API接口 ```python @app.route('/api/data') def json_data(): df = pd.read_excel('data.xlsx') return df.to_json(orient='records') ``` ## 高级功能实现 ### 1. 实时数据更新 ```python import schedule import time from datetime import datetime def refresh_data(): global df df = pd.read_excel('data.xlsx') print(f"{datetime.now()} - 数据已刷新") # 每小时刷新一次数据 schedule.every().hour.do(refresh_data) # 在单独线程中运行调度器 import threading def run_scheduler(): while True: schedule.run_pending() time.sleep(1) threading.Thread(target=run_scheduler, daemon=True).start() ``` ### 2. 大型文件分页处理 ```python from flask import request @app.route('/data') def paginated_data(): page = request.args.get('page', 1, type=int) per_page = 50 # 分块读取Excel chunks = pd.read_excel('large_data.xlsx', chunksize=per_page) # 定位到请求的页面 for i, chunk in enumerate(chunks): if i == page - 1: return chunk.to_html() return "页面超出范围", 404 ``` ### 3. 图表可视化集成 ```python import matplotlib.pyplot as plt import base64 from io import BytesIO @app.route('/dashboard') def dashboard(): df = pd.read_excel('sales_data.xlsx') # 生成销售趋势图 plt.figure(figsize=(10, 6)) df.groupby('month')['sales'].sum().plot(kind='bar', color='skyblue') plt.title('月度销售趋势') plt.tight_layout() # 将图表转换为Base64 img = BytesIO() plt.savefig(img, format='png') img.seek(0) plot_url = base64.b64encode(img.getvalue()).decode('utf8') # 在HTML中嵌入图表 return f'<img src="data:image/png;base64,{plot_url}">' ``` ## 常见问题解决方案 1. **中文乱码问题** ```python # 读取时指定编码 df = pd.read_excel('data.xlsx', encoding='utf-8') # 输出时设置字符集 response = make_response(df.to_html()) response.headers['Content-Type'] = 'text/html; charset=utf-8' ``` 2. **大型文件内存优化** ```python # 分块处理 chunk_size = 5000 chunks = pd.read_excel('large.xlsx', chunksize=chunk_size) for chunk in chunks: process_data(chunk) ``` 3. **公式计算值获取** ```python import openpyxl # 加载工作簿启用数据计算 wb = openpyxl.load_workbook('data.xlsx', data_only=True) sheet = wb.active # 获取公式计算结果 cell_value = sheet['B2'].value ``` 4. **浏览器中直接编辑** ```python from flask import request @app.route('/update', methods=['POST']) def update_data(): row = request.form['row'] col = request.form['col'] value = request.form['value'] # 更新Excel文件 wb = openpyxl.load_workbook('data.xlsx') sheet = wb.active sheet.cell(row=int(row), column=int(col), value=value) wb.save('data.xlsx') return "更新成功" ``` ## 最佳实践建议 1. **安全性考虑** - 对文件上传进行扩展名验证 - 限制文件大小 - 使用临时文件处理上传 ```python ALLOWED_EXTENSIONS = {'xlsx', 'xls'} def allowed_file(filename): return '.' in filename and \ filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS ``` 2. **性能优化** - 使用`openpyxl`直接读取避免Pandas开销 - 缓存已读取的数据 - 对静态文件使用CDN加速 3. **错误处理** ```python try: df = pd.read_excel('data.xlsx') except FileNotFoundError: return "文件不存在", 404 except Exception as e: return f"读取错误: {str(e)}", 500 ``` ## 相关问题 1. **如何实现Excel数据在浏览器中的实时更新?** - 使用WebSocket技术建立实时通信通道 - 结合JavaScript定时轮询获取最新数据 2. **如何处理包含宏和复杂公式的Excel文件?** - 使用`xlwings`库在Windows环境中执行Excel宏 - 将复杂公式转换为Python计算逻辑 3. **如何在浏览器中实现类似Excel的数据筛选和排序?** - 集成DataTables.js等前端表格库 - 使用React/Vue实现自定义表格组件 4. **如何保护敏感Excel数据不被未授权访问?** - 实现基于角色的访问控制(RBAC) - 对Excel文件进行加密存储 - 使用HTTPS传输数据 5. **如何将浏览器中的修改同步回Excel文件?** - 实现前后端分离的编辑接口 - 使用WebSocket实现双向通信 - 设计增量更新机制减少IO操作 以上解决方案可根据实际需求组合使用,创建功能强大的Excel数据浏览器应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值