精华内容
下载资源
问答
  • com excel
    千次阅读
    2019-09-26 17:14:08

    使用 win32com 读取excel

    def open_excel(path,open_password,write_password):
        #载入Excel
        xlApp=win32com.client.Dispatch("Excel.Application")
        '''
        设置是否打开Excel
        True:Excel可见
        Fasle:Excel不可见
        '''
        xlApp.Visible=True
        '''
        设置是否显示警告和消息框
        True:显示
        False:不显示
        '''
        xlApp.DisplayAlerts=False
        #打开Excel
        xlwb=xlApp.Workbooks.Open(Filename=path,UpdateLinks=0,
        ReadOnly=False,Format=None,Password=open_password,WriteResPassword=write_password)
        #获取某个Sheet页数据(页数从1开始)
        sheet_data=xlwb.Worksheets(1).UsedRange.Value
        #获取某个单元格数据 
        '''
        最好设置单元格格式为文本格式,默认格式读取
        全数字时,会在后面带上小数点:
        如单元格中为123,读取出来可能为123.0
        sheet_data[行][列]
        行,列都是从0开始计算
        '''
        data=sheet_data[0][0]
        #保存excel
        xlwb.Save()
        #关闭Excel
        xlwb.Close()
        xlApp.Quit()
    

    参数说明:
    Workbooks.Open 参数说明
    FileName: 要打开的工作簿的路径
    UpdateLinks:指定更新文件中外部引用(链接)的方式
    0: 不更新任何引用
    1: 更新外部引用,但不更新远程引用
    2: 更新远程引用,但不更新外部引用
    3: 同时更新外部引用与远程引用
    ReadOnly:True 为只读模式打开工作簿
    Format:由此参数指定分隔符。如果省略此参数,则使用当前的分隔符
    Password:打开受保护工作簿所需的密码
    WriteResPassword:写入受保护工作簿所需的密码

    更多相关内容
  • win32com excel转pdf

    千次阅读 2021-11-12 17:30:55
    需要用到库 from win32com.client import DispatchEx ...近来因为某些原因,需要将遍历一个双层文件夹,向里面的excel插入图片,并打印出来。 所谓双层: 即文件夹下包文件夹,类似于这种,对于数据整理来说十分...

    需要用到库

    from win32com.client import DispatchEx
    import os
    from PyPDF2 import PdfFileReader, PdfFileWriter
    #import time
    import win32process
    import win32api
    import win32con

    近来因为某些原因,需要将遍历一个双层文件夹,向里面的excel插入图片,并打印出来。

    所谓双层:

            即文件夹下包文件夹,类似于这种,对于数据整理来说十分方便,但要一个个去处理就太繁琐了,于是我写了一串代码。

    原理

    首先先遍历文件夹,获得文件夹下所有子级文件夹,然后再遍历子级文件夹,获得其中的excel文件,(因为权限原因,我不能直接修改excel,所以我建立了将之复制到新的excel进行操作),插入签名,再转换成pdf文件,以xlsx的名字命名,存在同一个文件夹下。

    代码

     

    img1=r'C:\Users\rz\Desktop\cc.jpg'           #精英干员瑕光嗷
    img2=r'C:\Users\rz\Desktop\hh.jpg' 
    #👆两个签名
    file_path=r'C:\Users\rz\Desktop\新建文件夹'
    
    def find_excel(file_path,img1,img2):                      #遍历文件夹
        folder=os.listdir(file_path)
        for f in folder:
            a,b=(os.path.splitext(f))
            if not b:                                #找到文件夹
                target_path=(os.path.join(file_path,f))
                
                if os.listdir(target_path)==[]:        #无甚么大用的判断,排除空文件夹
                    continue
                else:
                    folder_0=os.listdir(target_path)         #遍历子级文件夹
                    for gg in folder_0:
                        a,b=os.path.splitext(gg)
                        if b in ['.xlsx','.xls','.xlsm']:
                            path=os.path.join(target_path,a+b)        #找到目标文件
                            
                            turn_pdf(path,img1,img2,a,target_path)
                            
    def remove_excel(new_sheet,ws):
            
        last_line=ws.Range("B900").End(-4162).Row
        last_trace=new_sheet.Range("B900").End(-4162).Row    
        ws.Range('A1:U%d'%last_line).Copy(new_sheet.Range('A1'))
        return new_sheet
        
        
                        
    def turn_pdf(source_path,img1,img2,last_name,target_path):             #将excel转pdf
                                                                 #为防止上一份excel格式影响,每次重新新建
    
        xlApp = DispatchEx("Excel.Application")
        xlApp.Visible = True
        new_excel = xlApp.Workbooks.Add()
        new_sheet=new_excel.Worksheets(1)
        
        books = xlApp.Workbooks.Open(source_path)
        print(source_path)
        ws=books.Worksheets(1)
        
        remove_excel(new_sheet,ws)
        
        last_line=new_sheet.Range("B900").End(-4162).Row
        picture_top = new_sheet.Cells(2,7).Height *int(last_line+2)           #行,列
         
        target_name=os.path.join(target_path,last_name)                  
        
        new_sheet.Shapes.AddPicture(img1,1,1,new_sheet.Cells(8,5).Width*6,picture_top,200,200) #左边,顶边,宽度,高度
        new_sheet.Shapes.AddPicture(img2,1,1,new_sheet.Cells(8,5).Width*17,picture_top,200,200) #左边,顶边,宽度,高度
        
        new_sheet.PageSetup.Zoom = False
        new_sheet.PageSetup.FitToPagesTall = False
        new_sheet.PageSetup.FitToPagesWide = 1
        
        new_sheet.ExportAsFixedFormat(0, target_name)    #0保存为pdf文件,1保存为XPS文件
        books.Close(0)
        new_excel.Close(0)
        xlApp.Quit()    
        close_excel_by_force(xlApp)
        del xlApp
    
    
    
    def close_excel_by_force(excel):                        #关闭进程
        
        # Get the window's process id's
        hwnd = excel.Hwnd
        t, p = win32process.GetWindowThreadProcessId(hwnd)
        # Ask window nicely to close  
        try:
            handle = win32api.OpenProcess(win32con.PROCESS_TERMINATE, 0, p)
            if handle:
                win32api.TerminateProcess(handle, 0)
                win32api.CloseHandle(handle)
        except:
            pass
    
    find_excel(file_path,img1,img2)
    
    print('转换完毕!')
    

    展开全文
  • C++通过COM操作EXCEL

    千次阅读 2018-08-09 16:00:52
    C++通过COM操作EXCEL **  C++操作EXCEL网上有很多方法,我觉得通过微软自带的COM操作还是比较方便并且兼容性比较好的,总结了网上各个网页的博客分享,整理了一份我自己的理解。 一、封装Excel库  1、环境配置...

    **

    C++通过COM操作EXCEL

    **
      C++操作EXCEL网上有很多方法,我觉得通过微软自带的COM操作还是比较方便并且兼容性比较好的,总结了网上各个网页的博客分享,整理了一份我自己的理解。

    一、封装Excel库

      1、环境配置:VS2013加EXCEL2013
      2、封装步骤
       1、新建一个MFC项目
    MFC项目建立步骤1
    MFC项目建立步骤2
       2、右击项目选址类向导
       这里写图片描述
       3、选择类型库中的MFC库
       这里写图片描述
       4、网上说可以在可用类型库中直接找到Microsoft Office Excel库,我的电脑上没找到
       这里写图片描述
       5、所以我选择文件,找到EXCEl的安装路径,找到EXCEL.EXE
       这里写图片描述
       6、添加:_Application、_Workbook、_Worksheet、Workbooks、Worksheets、Range这些常用接口。
       这里写图片描述
       7、点击完成确定,会生成6个对应的文件。
       8、删除每个文件的# import “D:\program\Office15\EXCEL.EXE” no_namespace添加#pragma once#include

    9、按照上面操作再添加Validation、Interior、Font、Names四个类

    三、编写操作类

       1、新建ExcelOperation.h, ExcelOperation.cpp两个文件添加刚刚建立的10个类
       这里写图片描述
       2、编写类,使用单例模式
       ExcelOperation.h:

    #pragma once
    #include "CRange.h"
    #include "CApplication.h"
    #include "CWorkbook.h"
    #include "CWorkbooks.h"
    #include "CWorksheet.h"
    #include "CWorksheets.h"
    #include "CValidation.h"
    #include "Cnterior.h"
    #include "CFont0.h"
    #include "CNames.h"
    
    class ExcelOperation
    {
    private:
        ExcelOperation();
        ~ExcelOperation();
        static ExcelOperation* excel;
    public:
        static ExcelOperation* getInstance();
        static void destroyInstance();
    private:
        CApplication ExcelApp;
        CWorkbooks books;
        CWorkbook book;
        CWorksheets sheets;
        CWorksheet sheet;
        CRange range;
        CValidation validation;
        Cnterior interior;
        CFont0 font;
        CNames names;
        //CString filePath;
        LPDISPATCH lpDisp;
        //伪造的ExcelApp
        CApplication ExcelApp_fake;
        CWorkbooks books_fake;
        int excelVer;
    };
    

       ExcelOperation.cpp:
       

    #include "ExcelOperation.h"
    
    ExcelOperation* ExcelOperation::excel = nullptr;
    
    ExcelOperation::ExcelOperation()
    {
        lpDisp = NULL;
        excelVer = 0;
    }
    
    //获取对象
    ExcelOperation* ExcelOperation::getInstance()
    {
        if (excel == NULL)
        {
            excel = new ExcelOperation();
        }
        return excel;
    }
    //销毁对象
    void ExcelOperation::destroyInstance()
    {
        if (excel != NULL)
        {
            delete excel;
            excel = NULL;
        }
    }
    
    ExcelOperation::~ExcelOperation()
    {
        try
        {
            sheet.ReleaseDispatch();
            sheets.ReleaseDispatch();
            book.ReleaseDispatch();
            books.ReleaseDispatch();
            ExcelApp.ReleaseDispatch();
            ExcelApp.Quit();
            //退出伪装的app
            if (!ExcelApp_fake.get_ActiveSheet())
            {
                books_fake.ReleaseDispatch();
                ExcelApp_fake.ReleaseDispatch();
                ExcelApp_fake.Quit();
            }
        }
        catch (COleDispatchException*)
        {
            //AfxMessageBox(Notice_get_by_id(IDS_POW_OFF_EXCEL_FAIL));
            AfxMessageBox(_T("关闭Excel服务出错。"));
        }
    }
    
        3、判断Excel版本号    
    
    BOOL ExcelOperation::judgeExcelVer(int Ver)
    {
        HKEY hkey;
        int ret;
        CString str;
        LONG len;
        str.Format(_T("Excel.Application.%d"), Ver);
        str += _T("\\CLSID");
        ret = RegCreateKey(HKEY_CLASSES_ROOT, str, &hkey);
        if (ret == ERROR_SUCCESS)
        {
            RegQueryValue(HKEY_CLASSES_ROOT, str, NULL, &len);
            //如果注册表中 HKEY_CLASSES_ROOT\Excel.Application.x\CPLSID中的值为空,则读取到'\0',长度为2
            return len == 2 ? FALSE : TRUE;
        }
        else
        {
            return FALSE;
        }
    }
    
        4、启动Excel服务 
    
    BOOL ExcelProcess::createServer( CString officeVer )
    {
        //去除前后空格
        officeVer.Trim();
        //获取版本号字符
        CString verNum = officeVer.Right(4);
        int ver = _ttoi(verNum);
        switch(ver)
        {
        case 2003:
            if(judgeExcelVer(11))
            {
                if(ExcelApp.CreateDispatch(_T("Excel.Application.11"), NULL))
                {
                    excelVer = 2003;
                }
                else
                {
                    return FALSE;
                }
            }
            else
            {
                return FALSE;
            }
            break;
        case 2007:
            if(judgeExcelVer(12))
            {
                if(ExcelApp.CreateDispatch(_T("Excel.Application.12"), NULL))
                {
                    excelVer = 2007;
                }
                else
                {
                    return FALSE;
                }
            }
            else
            {
                return FALSE;
            }
            break;
        case 2010:
            if(judgeExcelVer(14))
            {
                if(ExcelApp.CreateDispatch(_T("Excel.Application.14"), NULL))
                {
                    excelVer = 2010;
                }
                else
                {
                    return FALSE;
                }
            }
            else
            {
                return FALSE;
            }
            break;
        case 2013:
            if( judgeExcelVer(15))
            {
                if(ExcelApp.CreateDispatch(_T("Excel.Application.15"), NULL))
                {
                    excelVer = 2013;
                }
                else
                {
                    return FALSE;
                }
            }
            else
            {
                return FALSE;
            }
            break;
        case 2016:
            if( judgeExcelVer(16))
            {
                if(ExcelApp.CreateDispatch(_T("Excel.Application.16"), NULL))
                {
                    excelVer = 2016;
                }
                else
                {
                    return FALSE;
                }
            }
            else
            {
                return FALSE;
            }
            break;
        }
        return TRUE;
    }
    
        5、初始化   
    
    BOOL ExcelOperation::init()
    {
        CString strOfficeVer[5] = { _T("office 2003"), _T("office 2007"), _T("office 2010"), _T("office 2013"), _T("office 2016") };
        BOOL result = FALSE;
        for (int i = 4; i >= 0; i--)
        {
            if (!createServer(strOfficeVer[i]))
                continue;
            else
            {
                result = TRUE;
            }
        }
        if (excelVer == 0)
        {
            result = FALSE;
        }
        return result;
    }
    
        6、设置界面隐藏显示
    
    //显示隐藏excel
    void ExcelOperation::setView(bool show)
    {
        ExcelApp.put_Visible(TRUE);
        ExcelApp.put_UserControl(FALSE);
    }
    7、另存为  
    void ExcelOperation::saveExcelAs(const char* savePath)
    {
        CString savePathCSt;
        ConstCharConver(savePath, savePathCSt);
        savePathCSt.Trim();
        book.SaveAs(_variant_t(savePathCSt),
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing, 0,
            vtMissing, vtMissing, vtMissing, vtMissing, vtMissing);
    }
    
        7、打开工作簿 
    
    BOOL ExcelOperation::openExcelFile(const char*path, const char* excleTemplate)
    {
        lpDisp = NULL;
    
        /*判断当前Excel的版本*/
        CString strExcelVersion = ExcelApp.get_Version();
        int iStart = 0;
        strExcelVersion = strExcelVersion.Tokenize(_T("."), iStart);
    
        setView(false);
    
        /*得到工作簿容器*/
        books.AttachDispatch(ExcelApp.get_Workbooks());
    
        /*打开一个工作簿,如不存在,则新增一个工作簿*/
        CString strBookPath;
        ConstCharConver(path, strBookPath);
        try
        {
            /*打开一个工作簿*/
            lpDisp = books.Open(strBookPath,
                vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
                vtMissing, vtMissing, vtMissing, vtMissing, vtMissing,
                vtMissing, vtMissing, vtMissing, vtMissing);
            book.AttachDispatch(lpDisp);
        }
        catch (...)
        {
            /*增加一个新的工作簿*/
            if (excleTemplate == nullptr)
            {
                lpDisp = books.Add(vtMissing);
            }
            else
            {
                lpDisp = books.Add(_variant_t(excleTemplate));
            }
            book.AttachDispatch(lpDisp);
            saveExcelAs(path);
        }
        return true;
    }
    
        8、打开Sheet   
    
    void ExcelOperation::OpenSheet(const char* sheetName)
    {
        LPDISPATCH lpDisp = NULL;
        /*得到工作簿中的Sheet的容器*/
        sheets.AttachDispatch(book.get_Sheets());
        /*打开一个Sheet,如不存在,就新增一个Sheet*/
        CString strSheetName(sheetName);
        try
        {
            /*打开一个已有的Sheet*/
            lpDisp = sheets.get_Item(_variant_t(strSheetName));
            sheet.AttachDispatch(lpDisp);
        }
        catch (...)
        {
            /*创建一个新的Sheet*/
            lpDisp = sheets.Add(vtMissing, vtMissing, _variant_t((long)1), vtMissing);
            sheet.AttachDispatch(lpDisp);
            sheet.put_Name(strSheetName);
        }
    }
    
        9、设置单元格格式   
    
    void ExcelOperation::setCellsFormat(const char* cellBeginChar, const char* cellBEndChar, const char* cellFormat)
    {
        CString cellBegin, cellEnd, format;
        ConstCharConver(cellBeginChar, cellBegin);
        ConstCharConver(cellBEndChar, cellEnd);
        ConstCharConver(cellFormat, format);
        lpDisp = sheet.get_Range(_variant_t(cellBegin), _variant_t(cellEnd));
        range.AttachDispatch(lpDisp);
        range.put_NumberFormatLocal(_variant_t(format));
    }
    
        10、设置单个单元格的值    
    
     void ExcelOperation::setCellValue(const char* ccellIndexChar, const char* valueChar)
    {
        CString cellIndex , value;
        ConstCharConver(ccellIndexChar, cellIndex);
        ConstCharConver(valueChar, value);
        range = sheet.get_Range(_variant_t(cellIndex), _variant_t(cellIndex));
        range.put_Value2(_variant_t(value));
    }
    
        11、设置单个单元格格式    
    
    void ExcelOperation::setCellFormat(const char* ccellIndexChar, const char* cellFormat)
    {
        CString cellIndex, cellFormatChar;
        ConstCharConver(ccellIndexChar, cellIndex);
        ConstCharConver(cellFormat, cellFormatChar);
        range = sheet.get_Range(_variant_t(cellIndex), _variant_t(cellIndex));
        range.put_NumberFormat(_variant_t(cellFormatChar));
    }
    
        12、初始化界面    
    
    非MFC项目使用*
    void ExcelOperation::InitializeUI()
    {
        if (S_OK != CoInitialize(NULL)){
            AfxMessageBox(_T("Initialize com failed..."));
            return;
        }
    }
    
        13、 释放资源
    
    void ExcelOperation::UnInitializeUI()
    {
        CoUninitialize();
    }
    
        14、保存   
    
    void ExcelOperation::saveExcel()
    {
        ExcelApp.put_DisplayAlerts(FALSE);
        //book.Close(vtMissing, vtMissing, vtMissing);
        book.Save();
    }
    
        15、CString转const char*  
    
    void ConstCharConver(const char* pFileName, CString &pWideChar)
        {
            //计算char *数组大小,以字节为单位,一个汉字占两个字节
            int charLen = strlen(pFileName);
    
            //计算多字节字符的大小,按字符计算。
            int len = MultiByteToWideChar(CP_ACP, 0, pFileName, charLen, NULL, 0);
    
            //为宽字节字符数组申请空间,数组大小为按字节计算的多字节字符大小
            TCHAR *buf = new TCHAR[len + 1];
    
            //多字节编码转换成宽字节编码
            MultiByteToWideChar(CP_ACP, 0, pFileName, charLen, buf, len);
    
            buf[len] = '\0';  //添加字符串结尾,注意不是len+1
    
            //将TCHAR数组转换为CString
    
            pWideChar.Append(buf);
        }
    

    四、编译

    1、编译出错
    warning C4003: “DialogBoxW”宏的实参不足
    error C2059: 语法错误:“,”
    把DialogBox改成_DialogBox
    
    在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "stdafx.h"
    修改为不适应预编译头
    

    这里写图片描述

    五、使用类

    1、添加一个按钮控件,双击。
    2、添加如下代码
    
    void CMFCApplication3Dlg::OnBnClickedButton1()
    {
        // TODO:  在此添加控件通知处理程序代码
        ExcelOperation* excel = ExcelOperation::getInstance();
        excel->init();
        excel->openExcelFile("C:\\test.xlsx");
        excel->OpenSheet("NewSheet");
        excel->setCellFormat("A1", "@");
        excel->setCellValue("A1", "3342");
        excel->setCellFormat("A2", "0.00");
        excel->setCellValue("A2", "3342.5684");
        excel->setView(true);
        excel->saveExcel();
        excel->saveExcelAs("C:\\saveTest.xlsx");
        excel->Close();
    
        excel->destroyInstance();
    }
    

    运行之后会在C盘下生成test.xlsx和saveTest.xlsx文件,A1格式为文本,A2格式为0.00形

    更多单元设置参考如下:
    CRange write_range;
    write_range.put_NumberFormat(_variant_t(“@”));//设置单元格为文本
    来源:https://blog.csdn.net/zhanglidn013/article/details/38900191

    文本类:
    1、@ 指定内容按文本显示,主要用于编码、手机号等用数字表示的文本。设定该格式后,可以保证导出excel时,此类文本不会被转成数字显示。
    数值类:
    1、 0.00 表示两位小数,例如3.10367显示为3.10
    2、 0.## 表示两位小数,当小数末位为0时,0将不显示。例如3.10显示为3.1
    3、 “#,##0.00 “表示两位小数,且显示千份位
    4、 #,##0.00;[Red]#,##0.00 表示负数红字
    5、0.00;[Red]0.00;” ” 表示负数红字,且数据为0时不显示
    6、0.00;Red;” “表示正数时两位小数,负数时两位小数并显示红色,0时不显示。0.00;Red只是一个示例,可以为任意的数字格式串,后边再加上;” “(空格)即表示数据为0时不显示。
    日期类:
    1、 yyyy-m-d
    2、 yyyy-MM-dd
    3、 yyyy-MM-dd hh:mm:ss
    4、 yyyy年MM月dd日
    百分比:
    1、0%
    2、0.00%
    详细请打开Excel2003,单元格右键,设置单元格格式,选一种格式,点自定义即可看到该格式的格式串;有的Excel格式串后有带”_”,在使用时,必须去掉。

    整个项目地址:https://download.csdn.net/download/littercooker/10593588

    本文参考网上许多大神文章,链接如下:
    https://www.cnblogs.com/ustclwx/p/4073423.html
    https://wenku.baidu.com/view/aece6e42f4335a8102d276a20029bd64793e6254.html
    https://blog.csdn.net/yukin_xue/article/details/11209283
    https://blog.csdn.net/zhanglidn013/article/details/38900191
    https://blog.csdn.net/GoForwardToStep/article/details/53079967

    展开全文
  • 调研-python使用win32com模块操纵excel

    千次阅读 2020-08-06 17:03:29
    背景介绍 支持库pypiwin32中含有win32com模块,安装(这个 pypiwin32没有github项目,主页:pypiwin32。 > pip install pypiwin32 ...不使用python自带的一些操作excel的库是因为这次的项目对excel格式要求

    背景介绍

    使用的工具是:pywin32

    PS:不是网上其他有些弄得那个什么pypiwin32 那个依赖pywin32 就是再封装了一层,也没有文档,使用说明等,而且在实际的代码调用中。

    import win32com.client as win32
    // 这里实际是通过pywin32作为python与win32com api接口的桥梁
    
    

    其他工具

    不使用python自带的一些操作excel的库是因为这次的项目对excel格式要求比较高,要求修改后的excel表格里的公式,特殊符号都不能变,要保留,所以选择使用 win32com模块来对excel进行操作处理。

    参见我的另一篇博客

    简单使用

    简单测试一下,看是否可以达到要求/期望。 参考 用win32com对Excel追加,修改数据,直接套到自己的excel表格中,格式及特殊字符确实没变,只影响了要改的特定行列的那些单元格,其余完全不变,o( ̄▽ ̄)d

    参考:

    wps和excel访问的API不同的问题

    这里存在一个问题,win32com使用必须要求电脑上安装有excel。尝试了wps(校园版),报错。搜索后发现其实这和注册表中DCOM组件对象的写入有关(类似电脑中默认打开excel文件的应用程序是哪个)

    尝试1:

    根据python win32com 操作wps Excel的注意事项,不同的wps版本使用的调用方式不一样,所以卸载校园版wps重新安装正式版wps

    # 报错信息:
    pywintypes.com_error: (-2147221005, '无效的类字符串', None, None)
    
    win32com.client.Dispatch("et.Application")#wps正式版
    win32com.client.Dispatch("ket.Application")#wps抢先版
    win32com.client.Dispatch("EXCEL.Application")#office EXCEL版
    

    不知道如何查看wps版本的,以WPS 2019为例,打开WPS首页,点击“设置”—>“关于WPS”,即可查看版本信息。
    img
    失败 此种操作无效

    尝试2:

    报错信息
    pywintypes.com_error: (-2147417851, '服务器出现意外情况。', None, None)
    

    网上可以找到的资料都是:操作matlab的读取excel时候遇到的
    读写excel数据出现服务器出现意外
    在这里插入图片描述

    由于电脑上没有office 只有wps 在 wps的com加载项中没有找到福昕阅读器相关的东西,卸载了福昕阅读器,无效。

    尝试3

    搜索过程中看到 VBA操作wps相关字眼,所以去搜索 VBA插件for wps 安装(我是wps2020 所以需要使用vba for wps 7.0版本),这样就可以启用wps的宏。 安装之后依然无效。

    尝试4

    pywintypes.com_error: (-2147352567, '发生意外 解决方案 :出现在Python调用WPS中

    看到这个人的博客,所以

    kwps=win32.Dispatch('kwps.Application')
    kwps.Workbooks.open('16-FLUKE8845.xls')
    
    报错:
    AttributeError: '<win32com.gen_py.Upgrade Kingsoft WPS 3.0 Object Library (Beta)._Application instance at 0x1866059667464>' object has no attribute 'Workbooks'
    

    尝试5

    安装了office,但是安装顺序是(office2013 wps 然后卸载office2013 然后wps没动,然后再安装office2016),调用时,采用office的调用方式,但是报错仍然是与wps相关

    import win32com.client as win32
    excel = win32.Dispatch('Excel.Application') #需要安装Excel
    wb = excel.Workbooks.open("./16-FLUKE8845.xls") #文件路径
    
    AttributeError: '<win32com.gen_py.Upgrade WPS Spreadsheets 3.0 Object Library (Beta)._Application instance at 0x2102370556680>' object has no attribute 'WorkBooks'
    // Workbooks 严格区分大小写 应该是 Workbooks 不是 大写B 改为之后报错
    
    AttributeError: '<win32com.gen_py.Upgrade WPS Spreadsheets 3.0 Object Library (Beta).Workbooks instance at 0x1915943788616>' object has no attribute 'open'
    

    搜索到如下内容,基本都是c#调用wps相关的东西

    另,附上wps自己的接口文档

    后来,动了动脑子,终于不再无脑百度了。直接进入WPS开放平台看文档才是正途啊。

    正道的光

    本人工作环境一个win10笔记本 一个win7台式机。两个机子由于wps版本,wps与office安装顺序不同。一个调用win32com 调的是 wps 另一个调的则是 office。。。很诡异。


    wps官方的接口文档-https://open.wps.cn/docs/office
    office官方的接口文档- https://docs.microsoft.com/en-us/office/vba/api/excel.workbook

    遇到有问题的地方,是 instance 就去查 对象。 是 attribute 就查 属性

    特别注意:无论是使用python调用wps还是office,本质都是调用其中的VBA接口,这时候传递的路径一定要是 绝对路径,而不是相对路径。不然会报错,找不到文件。


    wps文档重点关注
    在这里插入图片描述
    office文档重点关注
    Excel->Object model->Application object
    在这里插入图片描述

    对比(对同一个excel表做简单的读写修改,最后保存):

    import win32com.client as win32
    
    # wps
    excel = win32.Dispatch('ket.Application') #需要安装Excel
    wb = excel.Workbooks.Open("XXXXXXX/16-FLUKE8845.xls") #文件路径
    ws = wb.Worksheets('Sheet1') #具体那张表
    c_column = [11,21,31,41] #需要写入的数据
    xing=10 # 某一行,这里指第十行S
    ws.Range('C'+str(xing)).Value = c_column[0] #这里指对C10写入数据 1
    ws.Range('D'+str(xing)).Value = c_column[1] #这里指对D10写入数据 2
    ws.Range('E'+str(xing)).Value = c_column[2] #这里指对E10写入数据 3
    ws.Range('F'+str(xing)).Value = c_column[3] #这里指对F10写入数据 4
    wb.Save #保存表格
    
    # office
    excel = win32.Dispatch('Excel.Application') #需要安装Excel
    wb = excel.Workbooks.open("路径.xlsx") #文件路径
    ws = wb.Worksheets('表') #具体那张表
    c_column = [1,2,3,4] #需要写入的数据
    xing=10 # 某一行,这里指第十行
    ws.Range('C'+str(xing)).value = c_column[0] #这里指对C10写入数据 1
    ws.Range('D'+str(xing)).value = c_column[1] #这里指对D10写入数据 2
    ws.Range('E'+str(xing)).value = c_column[2] #这里指对E10写入数据 3
    ws.Range('F'+str(xing)).value = c_column[3] #这里指对F10写入数据 4
    wb.save #保存表格
    

    可以看到 wps和office调用时的两个区别:

    • Open函数的大小写,以及
    • value属性的大小写
    • 大概是wps为了和office做区分吧,刚好Python本身是大小写敏感的语言

    相关参考:

    展开全文
  • def copy_table_from_excel_to_word(): import time from win32com import client excel = client.Dispatch('Excel.Application') word = client.Dispatch('Word.Application') doc = word.D...
  • Python 二次开发 Excel 简介

    千次阅读 多人点赞 2019-09-09 19:01:16
    Microsoft office 开发人员中心 Excel GitHub MicrosoftDocs/VBA-Docs 目 录一、前沿二、示例代码二、参考文献三、尾声 一、前沿 利用本文代码可以实现读写.xlsx、.xls及.csv文件,单元格格式的简单设置,...
  • 如何使用 win32com 操作excel 入坑

    千次阅读 2020-12-16 14:51:24
    app打开方式的区别:https://stackoverflow.com/questions/50127959/win32-dispatch-vs-win32-gencache-in-python-what-are-the-pros-and-cons/53833740#53833740?newreg=0e69607c6e364894abde5a7be0fe5e29 ...
  • 利用matlab导入或读取数据至ExcelCOM方法和xlswrite、xlsread方法)1 Matlab自带函数1.1写入Excel1.2读取Excel1.3示例2 COM方法2.1 文件的读取与写入2.1.1 应用1:利用Excel画画2.2 纯数据的快速写入编辑 ...
  • Lua使用luacom模块操作EXCEL

    千次阅读 2018-05-29 10:41:30
    require('lfs') --导入lfs模块用于取得当前路径,和操作EXCEL无关 local sMainPath = lfs.currentdir() --取得当前路径 --创建EXCEL对象 MyExcel = luacom.CreateObject("Excel.Application") --创建EXC...
  • C#读写ExcelCom组件的方式)

    万次阅读 2018-02-12 08:56:40
    可以非常灵活的读取Excel中的数据,而且使用方式很丰富,基本上凡是打开Office Excel软件能够用鼠标点击完成的事,使用VSTO调用COM组件都能完成,而且可以调用Excel自身带的宏方法等。 但是,如果是Web站点部署在...
  • 文章目录一、处理Excel文件数据,对其筛选后的数据保存到新的Excel二、校验数据及保存新的Excel文件 一、处理Excel文件数据,对其筛选后的数据保存到新的Excel # -*- coding:utf-8 -*- import pandas as pd from ...
  • win32com python 查询excel行数列数

    千次阅读 2018-11-16 16:17:09
    import win32...xlApp = win32com.client.Dispatch('Excel.Application') xlApp.Visible = False xls = xlApp.Workbooks.Open(os.getcwd() + "\\test.xls") sheet = xls.Worksheets(1) info =...
  • 各类excel甘特图模板

    2019-02-14 20:51:02
    各类excel甘特图模板
  • C#操作Excel文件三种方式

    千次阅读 2017-08-02 14:02:01
    第二种,调用ExcelCOM组件。两种方式各有特点。 注意一些简单的问题1.excel文件只能存储65535行数据,如果你的数据大于65535行,那么就需要将excel分割存放了。2.关于乱码,这主要是字符设置问题。   一、OleDb...
  • 先发一下第一版速度超级慢的代码: Dim dt As New DataTable Dim ExcelApp As New Excel.Application Dim WorkBook As Excel.Workbook Dim WorkSheet As Excel.Worksheet Dim dt As New DataTable
  • 前面获取了Excel某一列数据并存入数组,接着我们继续获取Excel某一行数据并存入数组,方法基本一致,就一点小小的改动,以下是完整的代码: using System; using System.Collections.Generic; using System.Linq; ...
  • C#之excel新增sheet

    千次阅读 2019-12-17 21:18:29
    小伙伴们在用C#操作excel的时候,可能有需要新增sheet的需求,那么如何实现呢? 二、思路 通过Epplus组件提供的ExcelPackage.Workbook.Worksheets.Add的添加方法来实现 1.组件:Epplus epplus组件的安装使用参考 在...
  • C# Excel导入导出

    千次下载 热门讨论 2015-08-07 16:26:52
    C#调用NPOI进行Excel导入、导出。 文件为一个解决方案,包含了所有开发源码。 文章为:http://www.cnblogs.com/polk6/p/4425620.html
  • C++使用OLE/COM高速读写EXCEL的源码

    千次阅读 2016-06-27 19:43:20
    通过VC实现对Excel表格的操作的方法有多种,如:通过ODBC数据库实现,通过解析Excel表格文件,通过OLE/COM的实现。本文主要研究通过OLE/COM实现对Excel表格的操作。另外,本文主代码中汇聚各网友的智慧进行了优化...
  • Python之Excel图片处理(将excel chart另存为图片)

    万次阅读 热门讨论 2018-08-14 21:56:14
    Python将数据写入excel,将形成的chart复制到指定区域,最终将数据另存为图片
  • 主要是springboot+myBatis+poi+mysql的使用,从数据库查询到结果集导出excel到本地,从本地中的excel文件导入到数据库中。
  • 很多朋友在用 Excel.Application对excel进行操作时,会遇到关闭程序后EXCEl .EXE进程依然存在的问题,这里给出一个解决方案
  • 本篇博客是 Python 操作 excel 系列的第5篇,前4篇博客阅读地址如下所示: 2022 之Python操作 Excel,xlrd 与 xlwt 模块一文掌握 Python 操作 Excel,从 xlwings 模块开始 Python 操作 Excel 第3篇博客,python ...
  • pywin32+excel(一)——Python使用win32com/pywin32操作excel

    万次阅读 多人点赞 2020-08-15 11:37:30
    一千个读者一千个哈姆雷特,单纯 save()表 close()工作薄 还有quit()Excel APP,这三个写法就有很多不同的解释。。。 不喜欢解释太多,直接看代码吧,给一个简单的读取某个excel文件 修改后保存的例子。 excel = win...
  • Excel工作表中的数据十分庞大时,我们可以在某个选定的区域内添加“文本筛选器”、“数字筛选器”、“颜色筛选器”和“日期筛选器”等,对数据进行过滤。过滤后的工作表会显示所需数据并隐藏其余数据。 如下所示...
  • C#代码操作Excel,不需要安装office

    热门讨论 2016-01-14 13:55:20
    com.Ole.excel 源码,不需要在服务器上安装Excel,完全使用C#代码实现,更多excel支持的高级功能可能没有,但实际开发中基本够用了.附加了一个示例和一个Table导出到excel的示例
  • java向EXCEL中写入数据。里面有一个ExcelWrite.java的文件和一个jxl的jar包。
  • VC++(VS2010)读写Excel文件代码(附示例)

    千次下载 热门讨论 2014-11-22 13:27:24
    工作或学习中可能需要实现基于VC读\写Excel文件的功能,本人最近也遇到了该问题。中间虽经波折,但是最终还是找到了解决问题的办法。 在此跟大家分享,希望对跟我同样迷茫过的同学们有所帮助。 1、程序功能 1...
  • Laravel Excel(maatwebsite/excel )导入

    千次阅读 2022-04-09 15:59:21
    composer require maatwebsite/excel 使用Composer安装依赖 指定版本 composer require maatwebsite/excel=~3.1 3、配置修改: 将 ServiceProvider 添加到config/app.php 中注册服务提供者到 providers 数组: ...
  • 为了还原一个干净无侵扰的网络世界,本文将不进行大规模地分发,若您觉得此文有用,不妨小范围地分享到真正有需要的人手中功能概述修复ExcelCom加载项常见问题,如每次需重新勾选COM加载项或COM加载项被列入禁用清单...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 287,687
精华内容 115,074
关键字:

com excel