module_generate_goods_art_no_table.py 10 KB

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