Python: 书写阿拉伯字符与拉丁数字混合
Python: writing Arabic characters mixed with Latin Digits
我正在构建一个应用程序,它从 xml 文件中获取文本,然后将其显示在 PySide6 QWidgetTable 中,最后将其写入 python-docxtpl(docx 文件)。
在将数据写入 docx 文件之前,一切正常。
QtableWidget 单元格文本是根据需要的。
图片显示原始文本(在xml和QtableWidget中)和docx文件中的输出文本。
图片链接:
QtableWidget图片:
QtableWidget Picture
Docx 图片
Docx Table Picture
代码运行良好
方法读取xml并填充QtableWidget
def fill_teachers_tables(self):
tree = ET.parse(self.teachers_xml)
root = tree.getroot()
teacher = self.teachers_dialog.list_widget.currentItem().text()
hours = [hour.get('name') for hour in root.xpath('Teacher')[0][0]]
hours_list = [hour.get('name') for hour in root.xpath(
f'Teacher[@name="{teacher}"]/Day/Hour')]
self.teachers_dialog.morning_table.setColumnCount(
len(self.morning_days))
self.teachers_dialog.morning_table.setRowCount(len(hours))
self.teachers_dialog.morning_table.setHorizontalHeaderLabels(
self.morning_days)
self.teachers_dialog.morning_table.setVerticalHeaderLabels(hours)
for i in range(len(self.morning_days)):
for j in range(len(hours_list)):
try:
self.teachers_dialog.morning_table.setItem(
j, i, QTableWidgetItem(
root.xpath(
f'Teacher[@name="{teacher}"]/Day[@name="{self.morning_days[i]}"]/Hour[@name="{hours[j]}"]/Students')[0]
.get('name')))
except IndexError:
self.teachers_dialog.morning_table.setItem(
j, i, QTableWidgetItem(''))
写入docx模板的方法:
def export_single(self):
teacher = self.teachers_dialog.list_widget.currentItem().text()
tpl = DocxTemplate('./resources/template.docx')
context = {
'teacher': '',
'days': [],
'tbl_contents': [],
'hours': 0,
}
context['teacher'] = teacher
m_row_headers = [self.teachers_dialog.morning_table.verticalHeaderItem(
i).text() for i in range(self.teachers_dialog.morning_table.rowCount())]
m_col_headers = [self.teachers_dialog.morning_table.horizontalHeaderItem(i).text(
).split(' ')[0] for i in range(self.teachers_dialog.morning_table.columnCount())]
for i in range(len(m_row_headers)):
context['tbl_contents'].append({'hour': '', 'sets': []})
for j in range(len(m_col_headers)):
item = self.teachers_dialog.morning_table.item(i, j)
if item:
context['hours'] += 1
context['tbl_contents'][i]['hour'] = f'{m_row_headers[i]}'
context['tbl_contents'][i]['sets'].append(item.text())
else:
context['tbl_contents'][i]['hour'] = f'{m_row_headers[i]}'
context['tbl_contents'][i]['sets'].append('')
tpl.render(context)
tpl.save('result.docx')
PS: 无法嵌入图片
我尝试同时使用 python-bidi 和 arabic-reshaper 但没有用。
我认为问题出在句点 (.) 和连字符 (-)
我遇到所有阿拉伯文文本都以句点 (.) 结尾,句点转到文本的开头。
我发现了问题。
问题出在 docxtpl 上。
您需要在模板文件中从右到左编辑所有段落字体样式。
也是:
tpl = DocxTemplate('./resources/template.docx')
for p in tpl.docx.paragraphs:
p.style.font.rtl = True
for table in tpl.docx.tables:
for i in range(len(table.columns)):
for j in range(len(table.rows)):
for p in table.cell(j, i).paragraphs:
p.style.font.rtl = True
# Then fill your context and render it to the template
我正在构建一个应用程序,它从 xml 文件中获取文本,然后将其显示在 PySide6 QWidgetTable 中,最后将其写入 python-docxtpl(docx 文件)。 在将数据写入 docx 文件之前,一切正常。 QtableWidget 单元格文本是根据需要的。 图片显示原始文本(在xml和QtableWidget中)和docx文件中的输出文本。
图片链接:
QtableWidget图片:
QtableWidget Picture
Docx 图片
Docx Table Picture
代码运行良好
方法读取xml并填充QtableWidget
def fill_teachers_tables(self):
tree = ET.parse(self.teachers_xml)
root = tree.getroot()
teacher = self.teachers_dialog.list_widget.currentItem().text()
hours = [hour.get('name') for hour in root.xpath('Teacher')[0][0]]
hours_list = [hour.get('name') for hour in root.xpath(
f'Teacher[@name="{teacher}"]/Day/Hour')]
self.teachers_dialog.morning_table.setColumnCount(
len(self.morning_days))
self.teachers_dialog.morning_table.setRowCount(len(hours))
self.teachers_dialog.morning_table.setHorizontalHeaderLabels(
self.morning_days)
self.teachers_dialog.morning_table.setVerticalHeaderLabels(hours)
for i in range(len(self.morning_days)):
for j in range(len(hours_list)):
try:
self.teachers_dialog.morning_table.setItem(
j, i, QTableWidgetItem(
root.xpath(
f'Teacher[@name="{teacher}"]/Day[@name="{self.morning_days[i]}"]/Hour[@name="{hours[j]}"]/Students')[0]
.get('name')))
except IndexError:
self.teachers_dialog.morning_table.setItem(
j, i, QTableWidgetItem(''))
写入docx模板的方法:
def export_single(self):
teacher = self.teachers_dialog.list_widget.currentItem().text()
tpl = DocxTemplate('./resources/template.docx')
context = {
'teacher': '',
'days': [],
'tbl_contents': [],
'hours': 0,
}
context['teacher'] = teacher
m_row_headers = [self.teachers_dialog.morning_table.verticalHeaderItem(
i).text() for i in range(self.teachers_dialog.morning_table.rowCount())]
m_col_headers = [self.teachers_dialog.morning_table.horizontalHeaderItem(i).text(
).split(' ')[0] for i in range(self.teachers_dialog.morning_table.columnCount())]
for i in range(len(m_row_headers)):
context['tbl_contents'].append({'hour': '', 'sets': []})
for j in range(len(m_col_headers)):
item = self.teachers_dialog.morning_table.item(i, j)
if item:
context['hours'] += 1
context['tbl_contents'][i]['hour'] = f'{m_row_headers[i]}'
context['tbl_contents'][i]['sets'].append(item.text())
else:
context['tbl_contents'][i]['hour'] = f'{m_row_headers[i]}'
context['tbl_contents'][i]['sets'].append('')
tpl.render(context)
tpl.save('result.docx')
PS: 无法嵌入图片
我尝试同时使用 python-bidi 和 arabic-reshaper 但没有用。
我认为问题出在句点 (.) 和连字符 (-) 我遇到所有阿拉伯文文本都以句点 (.) 结尾,句点转到文本的开头。
我发现了问题。
问题出在 docxtpl 上。
您需要在模板文件中从右到左编辑所有段落字体样式。
也是:
tpl = DocxTemplate('./resources/template.docx')
for p in tpl.docx.paragraphs:
p.style.font.rtl = True
for table in tpl.docx.tables:
for i in range(len(table.columns)):
for j in range(len(table.rows)):
for p in table.cell(j, i).paragraphs:
p.style.font.rtl = True
# Then fill your context and render it to the template