Уведомления

Группа в Telegram: @pythonsu

#1 Май 16, 2014 22:31:52

ingfa_1981
Зарегистрирован: 2014-01-25
Сообщения: 200
Репутация: +  1  -
Профиль   Адрес электронной почты  

Помогите дописать программу создания отчетов

Уважаемые форумчане подскажите пожалуйста как записать множество файлов экзель, с названием лицевого счета и правильно отсортировать данные из списка, который я получил на выходе программы.

Имею на входе файл import.txt. Выложу его кусочек. Он представляет из себя импорт в текстовый файл ,значения которого разделены запятыми.
Пример строки из файла
394409,7005,20-04-2014-19-42,962СОТ,7416311,2,1,6.40,1367,,СОТОВАЯ,
1. номер заказа (не нужен)
2. 7005 номер телефона (может быть один и более принадлежит лицевому счету вместе с другими номерами, за день абонент может позвонить много раз или вообще не звонить)
3. дата звонка
4. код направления
5. номер куда звонили
6. длина разговора
7. количество звонков почему то всегда 1
8 сумма за заказ
9 лицевой счет (по которому нужно создавать файлы экзель например 1367.xls, название оранизации приходится брать из файла шаблона)
10 название направления

Из этого файла получился список spisok_obshiy_otsortirovaniy, в котором значения отсортированы по лицевым счетам, далее по номерам, далее по датам.

Как мне из всего этого получить множество файлов, в каждом из которых будут записаны данные конкретно по одному лицевому счету и принадлежащих ему номерах? С форматированием страниц я сам разберусь, а вот логику программы не осилил еще как дописать дальше.

# coding: utf8
import re
import sys
import xlwt
from xlwt import Workbook,easyxf
from xlrd import open_workbook,XL_CELL_TEXT, cellname
from tempfile import TemporaryFile
"""Шаблон цеха"""
book_shablon_ceha = open_workbook('ceha_shablon.xls')
ceha_shablon = book_shablon_ceha.sheet_by_index(0)
"""Шаблон подряд"""
book_shablon_podryad = open_workbook('podryad_shablon.xls')
podryad_shablon = book_shablon_podryad.sheet_by_index(0)
"""Файл цехов на запись"""
book_ceha = xlwt.Workbook('utf8')
ceha = book_ceha.add_sheet('Отчет по цехам')
"""Файл подрядных на запись"""
book_podryad = xlwt.Workbook('utf8')
podryad = book_podryad.add_sheet('Отчет по подрядным')
"""Фонты"""
font_red = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: right thin,left thin,top thin,bottom thin;')
font_blue = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: right thin,left thin,top thin,bottom thin;')
font_green = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: right thin,left thin,top thin,bottom thin;')
font_400 = xlwt.easyxf('font: height 300,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: right thin,left thin,top thin,bottom thin;')
font_240_i = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: right thin,left thin,top thin,bottom thin;')
bez_border = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;')
left_border = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border:left thin;')
right_border = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: right thin;')
verh_border = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: top thin;')
niz_border = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: bottom thin;')
niz_left = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: bottom thin,left thin;')
niz_right = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: bottom thin,right thin;')
verh_left = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: top thin,left thin;')
verh_right = xlwt.easyxf('font: height 240,name Times New Roman,colour_index black, bold off,italic off; align: wrap on, vert top, horiz left;pattern: pattern solid, fore_colour white;border: top thin,right thin;')
l = easyxf('border: right thin,left thin,top thin,bottom thin')
""" Создаем пустой словарь"""
slovar_iz_shablona_ceha = {}#словарь лицевых счетов и названий цехов
slovar_iz_shablona_podryad = {}#словарь лицевых счетов и названий подрядных организаций
spisok_obshiy_otsortirovaniy = []
slovar_otchet_ceha = {}
""""Прочитали столбик 1 (с 1 до 100) ячейки, загнали в список и отсортировали список """
nomer_pervoy_yacheyki_shablona_ceha = 0 #тут уже не менять
nomer_posledney_yacheyki_shablona_ceha = 100#это последняя ячейка шаблона в цехе с данными
for iterator_schetov_ceha in range(nomer_pervoy_yacheyki_shablona_ceha,nomer_posledney_yacheyki_shablona_ceha):
    lic_shet_shablon_v_slovar = int(ceha_shablon.cell(iterator_schetov_ceha,0).value)
    naz_org_shablon_v_slovar =  (ceha_shablon.cell(iterator_schetov_ceha,1).value)
    slovar_iz_shablona_ceha[lic_shet_shablon_v_slovar] = naz_org_shablon_v_slovar
""""Прочитали столбик 1 (с 0 до 31) ячейки, загнали в список и отсортировали список """
nomer_pervoy_yacheyki_shablona_podryad = 0 #тут уже не менять
nomer_posledney_yacheyki_shablona_podryad = 31#это последняя ячейка шаблона в цехе с данными
for iterator_schetov_podryad in range(nomer_pervoy_yacheyki_shablona_podryad,nomer_posledney_yacheyki_shablona_podryad):
    lic_shet_shablon_podryad_v_slovar = int(podryad_shablon.cell(iterator_schetov_podryad,0).value)
    naz_org_shablon_podryad_v_slovar =  (podryad_shablon.cell(iterator_schetov_podryad,1).value)
    slovar_iz_shablona_podryad[lic_shet_shablon_podryad_v_slovar] = naz_org_shablon_v_slovar
for line in open(r'import.txt'):
    shablon = line.split(',')
    #print shablon
    data = shablon[2][0:10]
    vremya = shablon[2][11:16]
    summa = float(shablon[7])
    nomer_telefona = int(shablon[1])
    lic_schet = int(shablon[8])
    kod = shablon[3].decode('cp866')
    nomer = int(shablon[4])
    dlina_razgovora = int(shablon[5])
    napravlenie = shablon[10].decode('cp866')
    naz_org_ceha = slovar_iz_shablona_ceha[lic_schet]
    if data and summa and nomer_telefona and lic_schet and nomer and kod and napravlenie and vremya and dlina_razgovora:
        spisok_obshiy_otsortirovaniy.append([lic_schet,nomer_telefona,naz_org_ceha,data, vremya,kod,nomer, napravlenie, dlina_razgovora,summa])
spisok_obshiy_otsortirovaniy.sort(key = lambda x: (x[0], x[1],x[3],x[4]))
print spisok_obshiy_otsortirovaniy
"""ceha.write(stroka, 0,spisok[0],font_400)
ceha.write(stroka, 1, spisok[1], font_240_i)
book_ceha.save(ceha_nazvanie_faila)
book_ceha.save(TemporaryFile())"""






Прикреплённый файлы:
attachment import.txt (4,8 KБ)

Офлайн

#2 Май 16, 2014 22:32:22

ingfa_1981
Зарегистрирован: 2014-01-25
Сообщения: 200
Репутация: +  1  -
Профиль   Адрес электронной почты  

Помогите дописать программу создания отчетов

шаблон

Прикреплённый файлы:
attachment ceha_shablon.xls (39,0 KБ)

Офлайн

#3 Май 16, 2014 22:32:50

ingfa_1981
Зарегистрирован: 2014-01-25
Сообщения: 200
Репутация: +  1  -
Профиль   Адрес электронной почты  

Помогите дописать программу создания отчетов

шаблон

Прикреплённый файлы:
attachment podryad_shablon.xls (29,5 KБ)

Офлайн

#4 Май 16, 2014 23:21:35

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Помогите дописать программу создания отчетов

ingfa_1981
Как мне из всего этого получить множество файлов, в каждом из которых будут записаны данные конкретно по одному лицевому счету и принадлежащих ему номерах?

Позволю себе дать совет. Вообще не нужно пихать данные в множество exel файлов, даже если начальство так ставит задачу. Это переливание из пустого в порожнее. Импортируйте все данные в базу данных. Из нее и получайте все виды отчетов, причем конечно не виде xls/xlsx делайте pdf или html.



Офлайн

#5 Май 17, 2014 01:21:15

ingfa_1981
Зарегистрирован: 2014-01-25
Сообщения: 200
Репутация: +  1  -
Профиль   Адрес электронной почты  

Помогите дописать программу создания отчетов

Отчет у нас в формате frp. Но эта задача для меня, я ее сам придумал, что бы научится, попрактиковаться. Поэтому и выбрал повторить отчет но уже в exel. Подскажите как доделать программу, буду благодарен.

Офлайн

#6 Май 18, 2014 16:08:57

ingfa_1981
Зарегистрирован: 2014-01-25
Сообщения: 200
Репутация: +  1  -
Профиль   Адрес электронной почты  

Помогите дописать программу создания отчетов

Кто нибудь подскажите как дописать .. Оч надо. Как выбрать из списка все звонки с одного телефона и суммировать его суммы за разговор?

Отредактировано ingfa_1981 (Май 18, 2014 16:11:15)

Офлайн

#7 Май 18, 2014 16:32:04

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Помогите дописать программу создания отчетов

ingfa_1981
Оч надо
так очень надо или учитесь?
import codecs
from itertools import groupby
i_cost = 7
i_tel = 1
def by_tel(v):
    return v[i_tel]
with codecs.open("aa.txt","r",encoding="utf-8") as f:
    data=[i.split(",") for i in f]
print [(int(i[0]),sum([float(j[i_cost]) for j in i[1]])) for i in groupby(sorted(data,key=by_tel),by_tel)]
>>> 
[(7005, 6.4), (7025, 589.5), (7050, 16.0), (7057, 52.5), (7059, 68.0), (7063, 48.0), (7076, 24.0), (7104, 4.0), (7106, 28.0), (711, 8.0)]



Отредактировано doza_and (Май 18, 2014 16:33:41)

Офлайн

#8 Май 18, 2014 16:47:17

ingfa_1981
Зарегистрирован: 2014-01-25
Сообщения: 200
Репутация: +  1  -
Профиль   Адрес электронной почты  

Помогите дописать программу создания отчетов

Круто , а как же мне теперь файлы записать по номеру лицевого счета, писать туда данные выбираемые из файла import принадлежащие именно этому лицевому счету?

И надо и учусь. хочу себе жизнь облегчить. наша программа создает файл отчет.frp, в который запихнули все лицевые счета. А мне нужно по одному лицевому счету все квитанции отдельно.

Офлайн

#9 Май 18, 2014 17:18:32

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Помогите дописать программу создания отчетов

сделал покороче

import pandas as pd
rd = pd.read_table("aa.txt",encoding="utf-8",sep=",",header=None,usecols=[1,7])
rd.columns=["t","p"]
print rd.groupby("t").sum()
>>> 
          p
t          
711     8.0
7005    6.4
7025  589.5
7050   16.0
7057   52.5
7059   68.0
7063   48.0
7076   24.0
7104    4.0
7106   28.0



Офлайн

#10 Май 18, 2014 17:30:11

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  253  -
Профиль   Отправить e-mail  

Помогите дописать программу создания отчетов

ingfa_1981
а как же мне теперь файлы записать по номеру лицевого счета
Вопрос не понятен. Ну есть еще поле лицевой счет. А если телефоны попали в разные лицевые счета? По идее оставьте еще лицевой счет и проведите агрегирование по составному ключу (телефон и лицевой счет) а затем по лицевым счетам.

А за генерацию множества xls файлов от меня можно и в глаз получить. Задолбало уже. Много народу так и норовит данные в xls формате предоставить. И памяти много жрет на диске и разбирать его сложно и неэффективно. Скиньте данные в СУБД и не парьте мозг себе и другим людям. Субд уже имеют все нужные вам средства генерации отчетов. Если нет, то mako в руки и делайте html.



Отредактировано doza_and (Май 18, 2014 17:32:16)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version