zoukankan      html  css  js  c++  java
  • excel导入

    # Copyright(c) 2016, David Mans, Konrad Sobon
    # @arch_laboratory, http://archi-lab.net, http://neoarchaic.net
    
    import clr
    import sys
    import System
    from System import Array
    from System.Collections.Generic import *
    
    clr.AddReferenceByName('Microsoft.Office.Interop.Excel, Version=11.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c')
    from Microsoft.Office.Interop import Excel
    System.Threading.Thread.CurrentThread.CurrentCulture = System.Globalization.CultureInfo("en-US")
    from System.Runtime.InteropServices import Marshal
    
    pyt_path = r'C:Program Files (x86)IronPython 2.7Lib'
    sys.path.append(pyt_path)
    
    from os import path
    assemblies = System.AppDomain.CurrentDomain.GetAssemblies()
    path1 = [a.Location for a in assemblies if 'bbIcons,' in a.FullName][0]
    path2 = System.IO.Path.GetDirectoryName(path1).rsplit('\',1)[0]
    bb_path = '%s\extra\' %path2
    sys.path.append(bb_path)
    import bumblebee as bb
    
    #The inputs to this node will be stored as a list in the IN variable.
    dataEnteringNode = IN
    
    filePath = IN[0]
    runMe = IN[1]
    sheetName = IN[2]
    byColumn = IN[3]
    origin = IN[4]
    extent = IN[5]
    
    if filePath != None:
        if filePath.GetType() == System.IO.FileInfo:
            filePath = filePath.FullName
    
    def ReadData(ws, origin, extent, byColumn):
    
        rng = ws.Range[origin, extent].Value2
        if not byColumn:
            dataOut = [[] for i in range(rng.GetUpperBound(0))]
            for i in range(rng.GetLowerBound(0)-1, rng.GetUpperBound(0), 1):
                for j in range(rng.GetLowerBound(1)-1, rng.GetUpperBound(1), 1):
                    dataOut[i].append(rng[i,j])
            return dataOut
        else:
            dataOut = [[] for i in range(rng.GetUpperBound(1))]
            for i in range(rng.GetLowerBound(1)-1, rng.GetUpperBound(1), 1):
                for j in range(rng.GetLowerBound(0)-1, rng.GetUpperBound(0), 1):
                    dataOut[i].append(rng[j,i])
            return dataOut
    
    def GetOrigin(ws, origin):
        if origin != None:
            origin = ws.Cells(bb.CellIndex(origin)[1], bb.CellIndex(origin)[0])
        else:
            origin = ws.Cells(ws.UsedRange.Row, ws.UsedRange.Column)
        return origin
    
    def GetExtent(ws, extent):
        if extent != None:
            extent = ws.Cells(bb.CellIndex(extent)[1], bb.CellIndex(extent)[0])
        else:
            extent = ws.Cells(ws.UsedRange.Rows(ws.UsedRange.Rows.Count).Row, ws.UsedRange.Columns(ws.UsedRange.Columns.Count).Column)
        return extent
    
    def SetUp(xlApp):
        # supress updates and warning pop ups
        xlApp.Visible = False
        xlApp.DisplayAlerts = False
        xlApp.ScreenUpdating = False
        return xlApp
    
    def ExitExcel(xlApp, wb, ws):
        # clean up before exiting excel, if any COM object remains
        # unreleased then excel crashes on open following time
        def CleanUp(_list):
            if isinstance(_list, list):
                for i in _list:
                    Marshal.ReleaseComObject(i)
            else:
                Marshal.ReleaseComObject(_list)
            return None
            
        xlApp.ActiveWorkbook.Close(False)
        xlApp.ScreenUpdating = True
        CleanUp([ws,wb,xlApp])
        return None
    
    def LiveStream():
        try:
            xlApp = Marshal.GetActiveObject("Excel.Application")
            xlApp.Visible = True
            xlApp.DisplayAlerts = False
            return xlApp
        except:
            return None
    
    live = False
    
    if runMe:
        try:
            errorReport = None
            message = None
            if filePath == None:
                # run excel in live mode
                xlApp = LiveStream()
                live = True
            else:
                # run excel from file on disk
                xlApp = SetUp(Excel.ApplicationClass())
                if path.isfile(unicode(filePath)):
                    xlApp.Workbooks.open(unicode(filePath))
                live = False                
            # get workbook
            wb = xlApp.ActiveWorkbook
            # get worksheet
            if sheetName == None:
                ws = xlApp.ActiveSheet
                dataOut = ReadData(ws, GetOrigin(ws, origin), GetExtent(ws, extent), byColumn)
                if not live:
                    ExitExcel(xlApp, wb, ws)
            elif not isinstance(sheetName, list):
                ws = xlApp.Sheets(sheetName)
                dataOut = ReadData(ws, GetOrigin(ws, origin), GetExtent(ws, extent), byColumn)
                if not live:
                    ExitExcel(xlApp, wb, ws)
            else:
                # process multiple sheets
                dataOut = []
                if isinstance(origin, list):
                    if isinstance(extent, list):
                        for index, (name, oValue, eValue) in enumerate(zip(sheetName, origin, extent)):
                            ws = xlApp.Sheets(str(name))
                            dataOut.append(ReadData(ws, GetOrigin(ws, oValue), GetExtent(ws, eValue), byColumn))
                    else:
                        for index, (name, oValue) in enumerate(zip(sheetName, origin)):
                            ws = xlApp.Sheets(str(name))
                            dataOut.append(ReadData(ws, GetOrigin(ws, oValue), GetExtent(ws, extent), byColumn))
                else:
                    if isinstance(extent, list):
                        for index, (name, eValue) in enumerate(zip(sheetName, extent)):
                            ws = xlApp.Sheets(str(name))
                            dataOut.append(ReadData(ws, GetOrigin(ws, origin), GetExtent(ws, eValue), byColumn))
                    else:
                        for index, name in enumerate(sheetName):
                            ws = xlApp.Sheets(str(name))
                            dataOut.append(ReadData(ws, GetOrigin(ws, origin), GetExtent(ws, extent), byColumn))
                if not live:
                    ExitExcel(xlApp, wb, ws)    
        except:
            xlApp.Quit()
            Marshal.ReleaseComObject(xlApp)
            # if error accurs anywhere in the process catch it
            import traceback
            errorReport = traceback.format_exc()
            pass
    else:
        errorReport = "Set RunMe to True."
    
    #Assign your output to the OUT variable
    if errorReport == None:
        OUT = dataOut
    else:
        OUT = errorReport

  • 相关阅读:
    hadoop再次集群搭建(3)-如何选择相应的hadoop版本
    48. Rotate Image
    352. Data Stream as Disjoint Interval
    163. Missing Ranges
    228. Summary Ranges
    147. Insertion Sort List
    324. Wiggle Sort II
    215. Kth Largest Element in an Array
    快速排序
    280. Wiggle Sort
  • 原文地址:https://www.cnblogs.com/ShirleyX/p/7999176.html
Copyright © 2011-2022 走看看