张三:李四,我最近在做一个宿舍信息管理系统,但遇到了一个问题,就是如何把系统里的数据导出成DOC文档。你有没有相关经验?
李四:哦,这个应该不难。你可以用Python的库来操作DOC文件,比如python-docx。不过你要先告诉我你的系统是用什么语言写的?
张三:我的系统是用Python写的,数据库用的是SQLite。现在需要把学生的信息,比如姓名、学号、宿舍号等,导出到一个DOC文件中。
李四:明白了。那我们可以用python-docx这个库来生成DOC文件。它支持创建表格、添加段落,甚至可以设置字体和样式。
张三:听起来不错。那具体怎么操作呢?能不能给我举个例子?
李四:当然可以。首先你需要安装python-docx库,可以用pip install python-docx来安装。
张三:好的,已经安装好了。接下来呢?
李四:接下来你可以导入库,然后创建一个Document对象。比如这样:from docx import Document;doc = Document()
张三:明白了。那怎么添加内容呢?比如标题或者表格?
李四:添加标题很简单,用doc.add_heading('宿舍信息')就可以。如果要添加表格,可以先创建一个表格对象,指定行数和列数。
张三:那表格的列数应该怎么定呢?比如我有学生姓名、学号、宿舍号这些字段。
李四:那就设置三列,分别对应这三个字段。然后循环遍历你的数据库查询结果,把每一行数据插入到表格中。
张三:那具体代码怎么写呢?能给我看一下吗?
李四:当然可以。下面是一个简单的示例代码:

from docx import Document
import sqlite3
# 创建文档对象
doc = Document()
# 添加标题
doc.add_heading('宿舍信息', 0)
# 连接数据库
conn = sqlite3.connect('dormitory.db')
cursor = conn.cursor()
# 查询数据
cursor.execute("SELECT name, student_id, dorm_number FROM students")
rows = cursor.fetchall()
# 创建表格
table = doc.add_table(rows=len(rows) + 1, cols=3)
table.style = 'Table Grid'
# 添加表头
hdr_cells = table.rows[0].cells
hdr_cells[0].text = '姓名'
hdr_cells[1].text = '学号'
hdr_cells[2].text = '宿舍号'
# 填充数据
for i, row in enumerate(rows):
row_cells = table.rows[i+1].cells
row_cells[0].text = row[0]
row_cells[1].text = row[1]
row_cells[2].text = row[2]
# 保存文档
doc.save('students_info.docx')
# 关闭连接
conn.close()
张三:哇,这段代码看起来很清晰。那我可以直接运行吗?
李四:是的,只要你的数据库名称是'dormitory.db',并且表名为'students',里面包含name、student_id、dorm_number这几个字段,就可以运行。
张三:那如果我要添加更多的信息,比如学生的联系方式或者照片呢?
李四:嗯,对于文字信息,可以直接添加段落或者表格。如果是图片的话,也可以用python-docx来插入图片。例如,用doc.add_picture('image.jpg')。
张三:那如果我要让生成的DOC文件更美观一点,比如调整字体、颜色或者加粗标题怎么办?
李四:这可以通过设置段落的样式来实现。比如,给标题加粗,可以这样做:paragraph = doc.add_heading('宿舍信息', 0),然后设置paragraph.bold = True。
张三:原来如此。那如果我想把整个系统的数据都导出到DOC里,是不是需要多次调用类似的代码?
李四:是的,你可以根据不同的数据类型,分别生成不同的表格或段落。比如,除了学生信息外,还可以添加宿舍管理员信息、宿舍楼列表等。
张三:那如果我要从DOC文件中读取数据呢?比如用户上传了一个DOC文件,我需要从中提取信息存入数据库。
李四:这个也是可以实现的。python-docx不仅可以生成DOC文件,还可以读取其中的内容。比如,可以遍历表格中的每一行,获取单元格中的文本。
张三:那具体的代码怎么写呢?能再给我举个例子吗?
李四:当然可以。以下是一个读取DOC文件并提取表格数据的例子:
from docx import Document
# 打开文档
doc = Document('students_info.docx')
# 遍历所有表格
for table in doc.tables:
for row in table.rows:
for cell in row.cells:
print(cell.text)
张三:这个代码好像只能打印出所有的单元格内容,那如果我要提取特定的数据呢?比如只提取学生姓名和学号?
李四:那你可以根据表格的列数来判断哪一列是姓名,哪一列是学号。比如,假设第一列是姓名,第二列是学号,那么可以这样做:
from docx import Document
doc = Document('students_info.docx')
for table in doc.tables:
for row in table.rows:
if len(row.cells) >= 2: # 确保有足够的列
name = row.cells[0].text
student_id = row.cells[1].text
print(f"姓名:{name},学号:{student_id}")
张三:太棒了!这样我就不用手动输入数据了。那如果我要把DOC文件作为附件发送给老师或者管理员呢?
李四:你可以将生成的DOC文件作为附件发送,或者集成到Web系统中,让用户下载。比如在Flask或Django中,可以设置响应类型为application/vnd.openxmlformats-officedocument.wordprocessingml.document,这样浏览器就会提示下载。
张三:明白了。那我现在对宿舍信息管理系统和DOC文件的交互有了更深的理解。
李四:没错,掌握这些技能后,你可以进一步扩展功能,比如添加权限控制、数据验证、邮件通知等。
张三:谢谢你,李四!今天真是收获满满。
李四:别客气,有问题随时问我!
