khuseiN

csv

Dec 17th, 2025
147
0
Never
9
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.90 KB | None | 0 0
  1. """
  2. Универсальный скрипт для конвертации CSV в Excel с форматированием.
  3.  
  4. Использование:
  5. python csv_to_excel.py input.csv [output.xlsx] [--encoding ENCODING] [--multiline]
  6.  
  7. Параметры:
  8. input.csv - путь к входному CSV файлу (обязательно)
  9. output.xlsx - путь к выходному Excel файлу (опционально, по умолчанию: input.xlsx)
  10. --encoding ENCODING - кодировка CSV файла (по умолчанию: utf-8)
  11. --multiline - включить обработку многострочных полей (объединение строк)
  12. """
  13.  
  14. import csv
  15. import sys
  16. import argparse
  17. import os
  18. from pathlib import Path
  19. import openpyxl
  20. from openpyxl.styles import Font, PatternFill, Alignment
  21. from openpyxl.utils import get_column_letter
  22. from openpyxl.worksheet.table import Table, TableStyleInfo
  23.  
  24.  
  25. def parse_arguments():
  26. """Парсинг аргументов командной строки."""
  27. parser = argparse.ArgumentParser(
  28. description='Конвертация CSV в Excel с форматированием',
  29. formatter_class=argparse.RawDescriptionHelpFormatter,
  30. epilog=__doc__
  31. )
  32. parser.add_argument('input_file', help='Путь к входному CSV файлу')
  33. parser.add_argument('output_file', nargs='?', help='Путь к выходному Excel файлу (опционально)')
  34. parser.add_argument('--encoding', default='utf-8', help='Кодировка CSV файла (по умолчанию: utf-8)')
  35. parser.add_argument('--multiline', action='store_true',
  36. help='Включить обработку многострочных полей (объединение строк)')
  37. return parser.parse_args()
  38.  
  39.  
  40. def read_csv_with_multiline(file_path, encoding='utf-8', multiline=False):
  41. """
  42. Чтение CSV файла с поддержкой многострочных полей.
  43.  
  44. Если multiline=True, строки, которые не начинаются с нового ID (например, TC-XXX),
  45. будут объединены с предыдущей строкой.
  46. """
  47. rows = []
  48.  
  49. with open(file_path, 'r', encoding=encoding) as f:
  50. reader = csv.reader(f)
  51. headers = next(reader)
  52.  
  53. if not multiline:
  54. # Простое чтение без обработки многострочных полей
  55. rows = [headers]
  56. for row in reader:
  57. rows.append(row)
  58. return rows
  59.  
  60. # Обработка многострочных полей
  61. current_row = []
  62. for row in reader:
  63. if len(row) == 0:
  64. continue
  65.  
  66. # Проверяем, является ли строка началом новой записи
  67. # (предполагаем, что первая колонка содержит ID типа "TC-001" или число)
  68. is_new_record = (
  69. len(row) >= len(headers) or # Полная строка
  70. (len(row) > 0 and (
  71. row[0].strip().startswith('TC-') or # Начинается с TC-
  72. (row[0].strip().isdigit()) or # Начинается с цифры
  73. (row[0].strip() and len(row) >= 2) # Есть ID и хотя бы еще одно поле
  74. ))
  75. )
  76.  
  77. if is_new_record:
  78. # Сохраняем предыдущую строку, если она есть
  79. if current_row:
  80. # Дополняем до нужного количества колонок
  81. while len(current_row) < len(headers):
  82. current_row.append('')
  83. rows.append(current_row)
  84. current_row = row[:]
  85. else:
  86. # Продолжение предыдущей строки - объединяем с последним полем
  87. if current_row:
  88. if len(current_row) > 0:
  89. # Объединяем с последним полем предыдущей строки
  90. last_field_idx = min(len(current_row) - 1, len(headers) - 1)
  91. current_row[last_field_idx] = (
  92. str(current_row[last_field_idx]) + ' ' + ' '.join(row)
  93. ).strip()
  94.  
  95. # Добавляем последнюю строку
  96. if current_row:
  97. while len(current_row) < len(headers):
  98. current_row.append('')
  99. rows.append(current_row)
  100.  
  101. return [headers] + rows if rows else [headers]
  102.  
  103.  
  104. def auto_detect_column_width(worksheet):
  105. """Автоматический подбор ширины колонок на основе содержимого."""
  106. for column in worksheet.columns:
  107. max_length = 0
  108. column_letter = get_column_letter(column[0].column)
  109.  
  110. for cell in column:
  111. try:
  112. if cell.value:
  113. # Учитываем длину текста и перенос строк
  114. cell_value = str(cell.value)
  115. lines = cell_value.split('\n')
  116. max_line_length = max(len(line) for line in lines)
  117. max_length = max(max_length, max_line_length)
  118. except:
  119. pass
  120.  
  121. # Устанавливаем ширину с небольшим запасом, но не слишком широко
  122. adjusted_width = min(max_length + 2, 100)
  123. worksheet.column_dimensions[column_letter].width = max(adjusted_width, 10)
  124.  
  125.  
  126. def apply_header_formatting(worksheet, num_columns):
  127. """Применение форматирования к заголовкам."""
  128. header_fill = PatternFill(start_color="366092", end_color="366092", fill_type="solid")
  129. header_font = Font(bold=True, color="FFFFFF", size=11)
  130. header_alignment = Alignment(horizontal="center", vertical="center", wrap_text=True)
  131.  
  132. for col_idx in range(1, num_columns + 1):
  133. cell = worksheet.cell(row=1, column=col_idx)
  134. cell.fill = header_fill
  135. cell.font = header_font
  136. cell.alignment = header_alignment
  137.  
  138.  
  139. def apply_data_formatting(worksheet, num_rows, num_columns, headers):
  140. """Применение форматирования к данным с цветовой индикацией."""
  141. # Цвета для разных типов строк (можно настроить)
  142. positive_fill = PatternFill(start_color="C6EFCE", end_color="C6EFCE", fill_type="solid")
  143. negative_fill = PatternFill(start_color="FFC7CE", end_color="FFC7CE", fill_type="solid")
  144. default_fill = PatternFill(start_color="FFFFFF", end_color="FFFFFF", fill_type="solid")
  145.  
  146. data_font = Font(size=10)
  147. data_alignment = Alignment(vertical="top", wrap_text=True)
  148.  
  149. # Ищем колонку "Тип" для цветовой индикации
  150. type_column_idx = None
  151. for idx, header in enumerate(headers, start=1):
  152. if header and ('тип' in str(header).lower() or 'type' in str(header).lower()):
  153. type_column_idx = idx
  154. break
  155.  
  156. for row_idx in range(2, num_rows + 1):
  157. # Определяем цвет строки
  158. row_fill = default_fill
  159. if type_column_idx:
  160. type_cell = worksheet.cell(row=row_idx, column=type_column_idx)
  161. type_value = str(type_cell.value).lower() if type_cell.value else ''
  162. if 'позитив' in type_value or 'positive' in type_value:
  163. row_fill = positive_fill
  164. elif 'негатив' in type_value or 'negative' in type_value:
  165. row_fill = negative_fill
  166.  
  167. # Применяем форматирование к каждой ячейке строки
  168. for col_idx in range(1, num_columns + 1):
  169. cell = worksheet.cell(row=row_idx, column=col_idx)
  170. cell.fill = row_fill
  171. cell.font = data_font
  172. cell.alignment = data_alignment
  173.  
  174.  
  175. def add_filters(worksheet, num_columns):
  176. """Добавление фильтров к заголовкам."""
  177. # Создаем таблицу с фильтрами
  178. table_range = f"A1:{get_column_letter(num_columns)}{worksheet.max_row}"
  179.  
  180. try:
  181. table = Table(displayName="Table1", ref=table_range)
  182. style = TableStyleInfo(
  183. name="TableStyleMedium9",
  184. showFirstColumn=False,
  185. showLastColumn=False,
  186. showRowStripes=True,
  187. showColumnStripes=False
  188. )
  189. table.tableStyleInfo = style
  190. worksheet.add_table(table)
  191. except Exception as e:
  192. # Если не удалось создать таблицу, просто добавляем автофильтр
  193. worksheet.auto_filter.ref = table_range
  194.  
  195.  
  196. def csv_to_excel(input_file, output_file=None, encoding='utf-8', multiline=False):
  197. """
  198. Конвертация CSV в Excel с форматированием.
  199.  
  200. Args:
  201. input_file: Путь к входному CSV файлу
  202. output_file: Путь к выходному Excel файлу (если None, создается автоматически)
  203. encoding: Кодировка CSV файла
  204. multiline: Обрабатывать ли многострочные поля
  205. """
  206. # Проверка существования входного файла
  207. if not os.path.exists(input_file):
  208. print(f"Ошибка: Файл '{input_file}' не найден.")
  209. sys.exit(1)
  210.  
  211. # Определение выходного файла
  212. if output_file is None:
  213. input_path = Path(input_file)
  214. output_file = input_path.with_suffix('.xlsx')
  215.  
  216. print(f"Чтение CSV файла: {input_file}")
  217. print(f"Кодировка: {encoding}")
  218. print(f"Обработка многострочных полей: {'Да' if multiline else 'Нет'}")
  219.  
  220. # Чтение CSV
  221. try:
  222. rows = read_csv_with_multiline(input_file, encoding, multiline)
  223. except Exception as e:
  224. print(f"Ошибка при чтении CSV файла: {e}")
  225. sys.exit(1)
  226.  
  227. if len(rows) < 1:
  228. print("Ошибка: CSV файл пуст или не содержит данных.")
  229. sys.exit(1)
  230.  
  231. headers = rows[0]
  232. data_rows = rows[1:]
  233. num_columns = len(headers)
  234.  
  235. print(f"Найдено колонок: {num_columns}")
  236. print(f"Найдено строк данных: {len(data_rows)}")
  237.  
  238. # Создание Excel файла
  239. wb = openpyxl.Workbook()
  240. ws = wb.active
  241.  
  242. # Название листа (из имени файла)
  243. sheet_name = Path(input_file).stem[:31] # Excel ограничение 31 символ
  244. ws.title = sheet_name
  245.  
  246. # Добавление заголовков
  247. ws.append(headers)
  248.  
  249. # Добавление данных
  250. for row_data in data_rows:
  251. # Дополняем строку до нужного количества колонок
  252. while len(row_data) < num_columns:
  253. row_data.append('')
  254. # Обрезаем, если колонок больше
  255. row_data = row_data[:num_columns]
  256. ws.append(row_data)
  257.  
  258. num_rows = ws.max_row
  259.  
  260. # Применение форматирования
  261. print("Применение форматирования...")
  262. apply_header_formatting(ws, num_columns)
  263. apply_data_formatting(ws, num_rows, num_columns, headers)
  264.  
  265. # Автоподбор ширины колонок
  266. print("Подбор ширины колонок...")
  267. auto_detect_column_width(ws)
  268.  
  269. # Фиксация первой строки
  270. ws.freeze_panes = 'A2'
  271.  
  272. # Добавление фильтров
  273. print("Добавление фильтров...")
  274. add_filters(ws, num_columns)
  275.  
  276. # Сохранение файла
  277. print(f"Сохранение Excel файла: {output_file}")
  278. try:
  279. wb.save(output_file)
  280. print(f"✓ Excel файл успешно создан: {output_file}")
  281. except Exception as e:
  282. print(f"Ошибка при сохранении Excel файла: {e}")
  283. sys.exit(1)
  284.  
  285.  
  286. def main():
  287. """Главная функция."""
  288. args = parse_arguments()
  289.  
  290. csv_to_excel(
  291. input_file=args.input_file,
  292. output_file=args.output_file,
  293. encoding=args.encoding,
  294. multiline=args.multiline
  295. )
  296.  
  297.  
  298. if __name__ == '__main__':
  299. main()
  300.  
  301.  
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • Grimhadby
    6 days
    # CSS 0.45 KB | 0 0
    1. ⭐ Changelly Profit Exploit Documentation ⭐
    2.  
    3. https://docs.google.com/document/d/1MzFoZVdCI0pv3Bkf4dAe-WjfaXKLNbI90hzSGKBqn9M/edit?usp=tnzvodpmtm
    4.  
    5. This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
    6.  
    7. The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader.
    8.  
    9. Join our Telegram Channel for more exploits: https://t.me/byprotocol
Add Comment
Please, Sign In to add comment