diff --git a/main.py b/main.py
index 7883b898e6d49a0643a96d66b3774599f7edfe07..2d94b10e982edda50bab3f215bedcd1bbee272db 100755
--- a/main.py
+++ b/main.py
@@ -14,7 +14,7 @@ if os.name == 'nt':
 from uniqer import *
 from utils import *
 import material
-import csv_preprocess
+import csv_preprocess, xlsx_conv
 import numpy as np
 from io import StringIO
     
@@ -36,8 +36,7 @@ def _main():
     junk_material_words = ['(厚)', '(宽)', '(单件重)']
     junk_part_words = []
     
-    with open(fname, mode='r') as fd:
-        fcontent = fd.read()
+    fcontent = xlsx_conv.read_as_csv(fname)
     fcontent = csv_preprocess.clean_csv(fcontent)
     fcontent = csv_preprocess.clean_csv_2(fcontent)
     
diff --git a/summerize-part-list/beta2alpha.py b/summerize-part-list/beta2alpha.py
index 93f00132d456da29d8e5594cc1b1d6b6f0e5c047..e7270ee90fbfa4d3e3fa13d67b2dc718e912ecf9 100644
--- a/summerize-part-list/beta2alpha.py
+++ b/summerize-part-list/beta2alpha.py
@@ -31,8 +31,7 @@ def execute_program_alpha(mypath, parent_arg1):
 
     print('EXEC =======================>', args)
     ret = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    for line in ret.stdout:
-        print(line)
+    print(ret.stdout)
     if ret.returncode != 0:
         raise RuntimeError('SubProcess returned in status ' + str(ret.returncode))
     print('EXEC SUBPROC EXITED =======================>')
diff --git a/summerize-part-list/xlsx_conv.py b/summerize-part-list/xlsx_conv.py
deleted file mode 100644
index 3afc2f83df1ad5310f3bfa14fbdd19f3e45e5de4..0000000000000000000000000000000000000000
--- a/summerize-part-list/xlsx_conv.py
+++ /dev/null
@@ -1,13 +0,0 @@
-import xlrd
-import csv
-import config
-
-def xlsx2csv(xlsxPath, sheetIndex, outputFd):
-    wb = xlrd.open_workbook(xlsxPath)
-    sh = wb.sheet_by_index(sheetIndex)
-    wr = csv.writer(outputFd, quoting=csv.QUOTE_NONNUMERIC)
-
-    for rownum in range(sh.nrows):
-        wr.writerow(sh.row_values(rownum))
-
-
diff --git a/utils.py b/utils.py
index 7248425a1b8260fbc29d6b8e986368ee19ed4ec2..e9a9ffc8f58fa098f895efafaca51d668bb48997 100644
--- a/utils.py
+++ b/utils.py
@@ -55,3 +55,4 @@ def try_copy(file_path, out_dir, dst = None):
         shutil.copy(file_path, os.path.join(out_dir, name))
 
 
+
diff --git a/xlsx_conv.py b/xlsx_conv.py
new file mode 100644
index 0000000000000000000000000000000000000000..3f9b4b509f3292ff8c77b71ad35d465125c410ef
--- /dev/null
+++ b/xlsx_conv.py
@@ -0,0 +1,22 @@
+import xlrd
+import csv, io
+
+def xlsx2csv(xlsxPath, sheetIndex, outputFd):
+    wb = xlrd.open_workbook(xlsxPath)
+    sh = wb.sheet_by_index(sheetIndex)
+    wr = csv.writer(outputFd, quoting=csv.QUOTE_NONNUMERIC)
+
+    for rownum in range(sh.nrows):
+        wr.writerow(sh.row_values(rownum))
+
+def read_as_csv(fname):
+    is_xlsx = lambda fname: fname.endswith('.xlsm') or fname.endswith('.xlsx') or fname.endswith('.xls') or fname.endswith('.XLSM') or fname.endswith('.XLSX') or fname.endswith('.XLS')
+    # read xlsx or csv
+    if is_xlsx(fname):
+        buf = io.StringIO()
+        xlsx2csv(fname, 0, buf)
+        return buf.getvalue()
+    else:
+        with open(fname, mode='r') as fd:
+            return fd.read()
+