如何合并相同的数据单元格?
How can merge same data cell?
我做了一些数据修改和写入xlsx的脚本。
我的文本文件包含以下数据。
WWN,Server Name,Server IP,SP port1,Storage Group1,SP port2,Storage Group2,LUN Count,LUN Capacity
8A:34,11B2,14,SP A_4,11B2,SP B_4,11B2,13,133
8A:36,11B2,14,SP A_8,11B2,SP B_8,11B2,13,133
8A:38,11B6,15,SP A_4,11B6,SP B_4,11B6,13,133
8A:3A,11B6,15,SP A_8,11B6,SP B_8,11B6,13,133
我想要使用关键数据合并相同的数据单元格。
关键数据是Storage Group1
。
如果 Storage Group1
单元格有相同的数据,将被合并 LUN count
LUN Capacity
.
下面是我的脚本不起作用。
import sys
import pandas as pd
import xlsxwriter
##Add workbook and worksheet
workbook = xlsxwriter.Workbook('emc_pool.xlsx', {'strings_to_numbers': True})
worksheet = workbook.add_worksheet(u'Host')
##Add Cell Style
bold = workbook.add_format({'bold': True, 'border': 1})
border = workbook.add_format({'border': 1})
merge_format = workbook.add_format({'bold': True, 'border': 1,'align': 'center', 'valign': 'vcenter'})
##aliase information
port_file = 'last_emc.txt'
port_table = pd.read_table(port_file, encoding='utf_8', sep=',', header=None, names=['WWN','Server Name','Server IP','SP port1','Storage Group1','SP port2','Storage Group2','LUN Count','LUN Capacity'], lineterminator='\n')
worksheet.merge_range('A1:G1', u'Host', merge_format)
worksheet.write('A2', 'Server Name', bold)
worksheet.write('B2', 'Server IP', bold)
worksheet.write('C2', 'WWN', bold)
worksheet.write('D2', 'SP port1', bold)
worksheet.write('E2', 'Storage Group1', bold)
worksheet.write('F2', 'SP port2', bold)
worksheet.write('G2', 'Storage Group2', bold)
worksheet.write('H2', 'LUN count', bold)
worksheet.write('I2', 'LUN Capacity', bold)
data = (port_table)
row = 2
col = 0
data_dict = {}
count = 0
for index, temp_data in data.iterrows():
data_line = data_dict.setdefault(temp_data[4], [0])
data_line[0] += (count + 1)
for key, data in data_dict.items():
if index != 0:
worksheet.write(row, col, temp_data[1], border)
worksheet.write(row, col + 1, temp_data[2], border)
worksheet.write(row, col + 2, temp_data[0], border)
worksheet.write(row, col + 3, temp_data[3], border)
for temp_data[4] in [key]:
worksheet.merge_range(int(row) + map(int,data), col + 7, temp_data[7], border)
worksheet.merge_range(int(row) + map(int,data), col + 8, temp_data[8], border)
else:
worksheet.merge_range(row, col + 7, temp_data[7], border)
worksheet.merge_range(row, col + 8, temp_data[8], border)
worksheet.write(row, col + 4, temp_data[4], border)
worksheet.write(row, col + 5, temp_data[5], border)
worksheet.write(row, col + 6, temp_data[6], border)
row += 1
## Clocse Workbook
workbook.close()
我要制作结果如下图
Question: I want same data cell merged using key data
使用 openpyxl
的解决方案,例如
Precondition: Ordered in key data
from openpyxl import Workbook
from openpyxl.styles import Alignment
wb = Workbook()
# Select First Worksheet
ws = wb.worksheets[0]
# Append Data from File
with open('last_emc.txt') as fh:
for row_data in fh:
ws.append(row_data[:-1].split(','))
key_column = 5
merge_columns = [8, 9]
start_row = 2
max_row = ws.max_row
key = None
# Iterate all rows in `key_colum`
for row, row_cells in enumerate(ws.iter_rows(min_col=key_column, min_row=start_row,
max_col=key_column, max_row=max_row),
start_row):
if key != row_cells[0].value or row == max_row:
# moved line below this if
# if row == max_row: row += 1
if not key is None:
for merge_column in merge_columns:
ws.merge_cells( start_row=start_row, start_column=merge_column,
end_row=row - 1, end_column=merge_column)
ws.cell(row=start_row, column=merge_column).\
alignment = Alignment(horizontal='center', vertical='center')
start_row = row
key = row_cells[0].value
#moved below line here as it was merging last two rows content even if the values differ.
if row == max_row: row += 1
wb.save("emc_pool.xlsx")
Output:
测试 Python: 3.4.2 - openpyxl: 2.4.1
我做了一些数据修改和写入xlsx的脚本。
我的文本文件包含以下数据。
WWN,Server Name,Server IP,SP port1,Storage Group1,SP port2,Storage Group2,LUN Count,LUN Capacity
8A:34,11B2,14,SP A_4,11B2,SP B_4,11B2,13,133
8A:36,11B2,14,SP A_8,11B2,SP B_8,11B2,13,133
8A:38,11B6,15,SP A_4,11B6,SP B_4,11B6,13,133
8A:3A,11B6,15,SP A_8,11B6,SP B_8,11B6,13,133
我想要使用关键数据合并相同的数据单元格。
关键数据是Storage Group1
。
如果 Storage Group1
单元格有相同的数据,将被合并 LUN count
LUN Capacity
.
下面是我的脚本不起作用。
import sys
import pandas as pd
import xlsxwriter
##Add workbook and worksheet
workbook = xlsxwriter.Workbook('emc_pool.xlsx', {'strings_to_numbers': True})
worksheet = workbook.add_worksheet(u'Host')
##Add Cell Style
bold = workbook.add_format({'bold': True, 'border': 1})
border = workbook.add_format({'border': 1})
merge_format = workbook.add_format({'bold': True, 'border': 1,'align': 'center', 'valign': 'vcenter'})
##aliase information
port_file = 'last_emc.txt'
port_table = pd.read_table(port_file, encoding='utf_8', sep=',', header=None, names=['WWN','Server Name','Server IP','SP port1','Storage Group1','SP port2','Storage Group2','LUN Count','LUN Capacity'], lineterminator='\n')
worksheet.merge_range('A1:G1', u'Host', merge_format)
worksheet.write('A2', 'Server Name', bold)
worksheet.write('B2', 'Server IP', bold)
worksheet.write('C2', 'WWN', bold)
worksheet.write('D2', 'SP port1', bold)
worksheet.write('E2', 'Storage Group1', bold)
worksheet.write('F2', 'SP port2', bold)
worksheet.write('G2', 'Storage Group2', bold)
worksheet.write('H2', 'LUN count', bold)
worksheet.write('I2', 'LUN Capacity', bold)
data = (port_table)
row = 2
col = 0
data_dict = {}
count = 0
for index, temp_data in data.iterrows():
data_line = data_dict.setdefault(temp_data[4], [0])
data_line[0] += (count + 1)
for key, data in data_dict.items():
if index != 0:
worksheet.write(row, col, temp_data[1], border)
worksheet.write(row, col + 1, temp_data[2], border)
worksheet.write(row, col + 2, temp_data[0], border)
worksheet.write(row, col + 3, temp_data[3], border)
for temp_data[4] in [key]:
worksheet.merge_range(int(row) + map(int,data), col + 7, temp_data[7], border)
worksheet.merge_range(int(row) + map(int,data), col + 8, temp_data[8], border)
else:
worksheet.merge_range(row, col + 7, temp_data[7], border)
worksheet.merge_range(row, col + 8, temp_data[8], border)
worksheet.write(row, col + 4, temp_data[4], border)
worksheet.write(row, col + 5, temp_data[5], border)
worksheet.write(row, col + 6, temp_data[6], border)
row += 1
## Clocse Workbook
workbook.close()
我要制作结果如下图
Question: I want same data cell merged using key data
使用 openpyxl
的解决方案,例如
Precondition: Ordered in key data
from openpyxl import Workbook
from openpyxl.styles import Alignment
wb = Workbook()
# Select First Worksheet
ws = wb.worksheets[0]
# Append Data from File
with open('last_emc.txt') as fh:
for row_data in fh:
ws.append(row_data[:-1].split(','))
key_column = 5
merge_columns = [8, 9]
start_row = 2
max_row = ws.max_row
key = None
# Iterate all rows in `key_colum`
for row, row_cells in enumerate(ws.iter_rows(min_col=key_column, min_row=start_row,
max_col=key_column, max_row=max_row),
start_row):
if key != row_cells[0].value or row == max_row:
# moved line below this if
# if row == max_row: row += 1
if not key is None:
for merge_column in merge_columns:
ws.merge_cells( start_row=start_row, start_column=merge_column,
end_row=row - 1, end_column=merge_column)
ws.cell(row=start_row, column=merge_column).\
alignment = Alignment(horizontal='center', vertical='center')
start_row = row
key = row_cells[0].value
#moved below line here as it was merging last two rows content even if the values differ.
if row == max_row: row += 1
wb.save("emc_pool.xlsx")
Output:
测试 Python: 3.4.2 - openpyxl: 2.4.1