module_generate_goods_art_no_table.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. from UI.generate_goods_art_no_table.generate_goods_art_no_table_ui import (
  2. Ui_Form as generate_goods_art_no_table_Ui_Form,
  3. )
  4. from import_qt_mode import *
  5. import os
  6. import time
  7. import threading
  8. import xlsxwriter
  9. import shutil
  10. from module.base_mode.pic_deal import Picture
  11. from PIL import Image
  12. from module.view_control.MineQWidget import MineQWidget
  13. from module.base_mode.excel_base_func import *
  14. class GenerateGoodsArtNoTable(MineQWidget, generate_goods_art_no_table_Ui_Form):
  15. # 货号表生成
  16. progress_sign = Signal(dict)
  17. info_sign = Signal(str)
  18. def __init__(self):
  19. super().__init__()
  20. self.is_del = False
  21. self.setupUi(self)
  22. # 0禁用 1进行中 2已结束
  23. self.state = 2
  24. self.init()
  25. self.show()
  26. def init(self):
  27. self.label_4.setText("请选择需要生成货号表的文件夹路径")
  28. self.label_3.setText("请选择目录")
  29. self.label_3.mousePressEvent = self.get_img_dir
  30. self.textBrowser_2.hide()
  31. self.progressBar.setValue(0)
  32. self.progressBar.setMaximum(100)
  33. self.progressBar.setValue(0)
  34. self.progressBar.hide()
  35. self.label_5.setText("")
  36. self.progress_sign.connect(self.show_progress)
  37. self.pushButton.clicked.connect(self.run)
  38. self.textBrowser_2.hide()
  39. def get_img_dir(self, *args):
  40. folder = QFileDialog.getExistingDirectory(self, "选取文件夹", "./")
  41. self.label_4.setText(folder)
  42. def show_progress(self, data):
  43. progress_bar_value = data["progress_bar_value"]
  44. self.label_5.setText(data["type"])
  45. self.progressBar.setValue(progress_bar_value)
  46. pass
  47. def check(self):
  48. _path = self.image_dir + "/历史"
  49. if not os.path.exists(_path):
  50. os.mkdir(_path)
  51. return True
  52. def set_state(self, state_value: int):
  53. # 0禁用 1进行中 2已结束
  54. if state_value not in [0, 1, 2]:
  55. return
  56. self.state = state_value
  57. if self.state == 0:
  58. self.pushButton.setText("执行中")
  59. self.pushButton.setEnabled(False)
  60. if self.state == 1:
  61. self.progressBar.show()
  62. self.textBrowser_2.show()
  63. self.pushButton.setText("执行中")
  64. self.pushButton.setEnabled(False)
  65. self.textBrowser_2.clear()
  66. if self.state == 2:
  67. self.pushButton.setText("执行完毕")
  68. self.pushButton.setEnabled(True)
  69. self.progressBar.hide()
  70. def run(self):
  71. self.set_state(state_value=1)
  72. self.t = threading.Thread(target=self.run_by_thread, args=())
  73. self.t.start()
  74. def show_progress_detail(self, text):
  75. self.textBrowser_2.append(text)
  76. def run_by_thread(self, dir_path=None):
  77. if not dir_path:
  78. dir_path = self.label_4.text()
  79. if not dir_path:
  80. self.show_progress_detail("请选择文件夹")
  81. self.set_state(state_value=2)
  82. return
  83. if not os.path.exists(dir_path):
  84. self.show_progress_detail("该文件夹不存在")
  85. self.set_state(state_value=2)
  86. return
  87. GenerateGoodsArtNoTable.deal(dir_path)
  88. # 完成处理
  89. self.set_state(state_value=2)
  90. def save_as_excel(self, out_excel_data, out_excel_path=None):
  91. self.show_progress_detail("开始尝试导出Excel文件~~~~")
  92. def close_book(_book):
  93. try:
  94. _book.close()
  95. except BaseException as e:
  96. print(e)
  97. self.show_progress_detail("请先关闭文件:{}".format(out_excel_path))
  98. return False
  99. return True
  100. options = {
  101. "default_format_properties": {
  102. "align": "left",
  103. "valign": "vcenter",
  104. "text_wrap": True,
  105. }
  106. }
  107. book = xlsxwriter.Workbook(filename=out_excel_path, options=options)
  108. sheet = book.add_worksheet("sheet1")
  109. # sheet.freeze_panes(1, 2)
  110. sheet.set_column("B:B", 17)
  111. sheet.write_row("A1", ["货号", "缩略图"])
  112. for index, data in enumerate(out_excel_data):
  113. # print(data)
  114. goods_no, image_file = data
  115. try:
  116. im = Image.open(image_file)
  117. im_x, im_y = im.size
  118. image_width = 100
  119. image_height = int(im_y * image_width / im_x)
  120. sheet.set_row(index + 1, 95)
  121. x_scale = round(image_width / im_x, 2) # 固定宽度/要插入的原始图片宽
  122. y_scale = round(image_height / im_y, 2) # 固定高度/要插入的原始图片高
  123. sheet.insert_image(
  124. index + 1,
  125. 1,
  126. image_file,
  127. {
  128. "x_scale": x_scale,
  129. "y_scale": y_scale,
  130. "x_offset": 5,
  131. "y_offset": 5,
  132. },
  133. )
  134. except:
  135. self.show_progress_detail("图片异常,{}".format(image_file))
  136. pass
  137. sheet.write_row("A{}".format(index + 2), [goods_no])
  138. close_book(book)
  139. self.show_progress_detail("已保存文件至:{}".format(out_excel_path))
  140. # while 1:
  141. # if self.is_del:
  142. # break
  143. #
  144. # if not close_book(book):
  145. # time.sleep(1)
  146. # self.show_progress_detail("请先关闭文件:{}".format(out_excel_path))
  147. # else:
  148. # self.show_progress_detail("已保存文件至:{}".format(out_excel_path))
  149. # break
  150. @classmethod
  151. def deal(cls, dir_path):
  152. def close_book(_book):
  153. try:
  154. _book.close()
  155. except BaseException as e:
  156. print(e)
  157. return False
  158. return True
  159. # print("dir_path", dir_path)
  160. out_excel_data = []
  161. for goods_art_no_folder in os.listdir(dir_path): # 遍历货号文件夹集合
  162. if not os.path.isdir(
  163. "{}/{}".format(dir_path, goods_art_no_folder)
  164. ): # 非文件夹进行过滤
  165. continue
  166. if "软件" in goods_art_no_folder:
  167. continue
  168. # print("goods_art_no_folder", goods_art_no_folder)
  169. # 如果存在800的主图,则优先进行使用
  170. big_image_folder_path = "{}/{}/800x800".format(
  171. dir_path, goods_art_no_folder
  172. )
  173. if not os.path.exists(big_image_folder_path):
  174. os.mkdir(big_image_folder_path)
  175. all_big_images = os.listdir(big_image_folder_path)
  176. goods_pic_total = len(all_big_images)
  177. _Type = [".png", ".PNG", ".jpg", ".JPG", ".gif", ".GIF", ".jpge", ".JPGE"]
  178. thumb_image_file_path = None
  179. # print("all_big_images",all_big_images)
  180. if all_big_images:
  181. for _file in all_big_images:
  182. # print(_file)
  183. file_name, e = os.path.splitext(_file)
  184. # print(file_name, e)
  185. if e in _Type:
  186. thumb_image_file_path = "{}/{}/800x800/{}".format(
  187. dir_path, goods_art_no_folder, _file
  188. )
  189. break
  190. # 如果不存在主图则进行使用原始图
  191. if thumb_image_file_path is None:
  192. _path = "{}/{}/原始图".format(dir_path, goods_art_no_folder)
  193. if not os.path.exists(_path):
  194. continue
  195. all_original_images = os.listdir(_path) # 遍历货号原始图文件夹
  196. goods_pic_total = len(all_original_images)
  197. if not all_original_images:
  198. continue
  199. image_file = all_original_images[0] # 取第一个货号图
  200. image_file_path = "{}/{}/原始图/{}".format(
  201. dir_path, goods_art_no_folder, image_file
  202. )
  203. if not os.path.exists(
  204. "{}/{}/200images".format(dir_path, goods_art_no_folder)
  205. ):
  206. os.mkdir("{}/{}/200images".format(dir_path, goods_art_no_folder))
  207. thumb_image_file_path = "{}/{}/200images/{}".format(
  208. dir_path, goods_art_no_folder, image_file
  209. )
  210. if not os.path.exists(thumb_image_file_path):
  211. # 开始触发进行压缩生成文件
  212. shutil.copy(image_file_path, thumb_image_file_path) # 复制文件
  213. pic = Picture(thumb_image_file_path)
  214. pic.resize(width=600)
  215. pic.save_img(thumb_image_file_path)
  216. # print("thumb_image_file_path", thumb_image_file_path)
  217. goods_number = ""
  218. if "@" in goods_art_no_folder:
  219. _ = goods_art_no_folder.split("@")
  220. goods_art_no_folder = _[0]
  221. goods_number = _[1].replace("NUM", "")
  222. out_excel_data.append(
  223. [
  224. goods_number,
  225. goods_art_no_folder,
  226. thumb_image_file_path,
  227. goods_pic_total,
  228. ]
  229. )
  230. if out_excel_data:
  231. out_excel_path = "{}/货号表-{}.xlsx".format(dir_path, time.time())
  232. options = {
  233. "default_format_properties": {
  234. "align": "left",
  235. "valign": "vcenter",
  236. "text_wrap": True,
  237. }
  238. }
  239. book = xlsxwriter.Workbook(filename=out_excel_path, options=options)
  240. sheet = book.add_worksheet("sheet1")
  241. # sheet.freeze_panes(1, 2)
  242. sheet.set_column("B:B", 17)
  243. sheet.set_column("D:D", 20)
  244. sheet.write_row("A1", ["编号", "原货号", "新货号", "缩略图", "原始图张数"])
  245. for index, data in enumerate(out_excel_data):
  246. # print(data)
  247. goods_number, goods_art_no, image_file, goods_pic_total = data
  248. try:
  249. im = Image.open(image_file)
  250. im_x, im_y = im.size
  251. image_width = 100
  252. image_height = int(im_y * image_width / im_x)
  253. sheet.set_row(index + 1, 95)
  254. x_scale = round(
  255. image_width / im_x, 2
  256. ) # 固定宽度/要插入的原始图片宽
  257. y_scale = round(
  258. image_height / im_y, 2
  259. ) # 固定高度/要插入的原始图片高
  260. sheet.insert_image(
  261. index + 1,
  262. 3,
  263. image_file,
  264. {
  265. "x_scale": x_scale,
  266. "y_scale": y_scale,
  267. "x_offset": 5,
  268. "y_offset": 5,
  269. "object_position":1,
  270. },
  271. )
  272. except:
  273. pass
  274. sheet.write_row("A{}".format(index + 2), [goods_number])
  275. sheet.write_row("B{}".format(index + 2), [goods_art_no])
  276. sheet.write_row("E{}".format(index + 2), [goods_pic_total])
  277. close_book(book)
  278. def __del__(self):
  279. self.is_del = True