精华内容
下载资源
问答
  • C++-加载EXCEL数据

    万次阅读 2021-06-25 08:25:49
    C++代码实现加载excel存储的的图像数据

    场景需求

           在用C++编程时,有保存数据的需求就有加载数据的需求,加载EXCEL数据的方式各式各样,本文主要针对上篇文章讲的“保存图像数据至EXCEL”,提供了一种对应的加载EXCEL图像数据的函数。大家可以根据自身需求进行修改。

    功能函数代码

    cv::Mat ReadPicFromExcel(string name)
    {
        // result是所要提取的图像
    	cv::Mat result,pic;
        // 所要提取文件的名字
    	ifstream infile(name);
    	string str;
    	int col = 0;
        // 一行行读取
    	while (getline(infile, str))
    	{
    		string temp;
    		stringstream input(str);
    		col = 0;
            // 单个数据提取
    		while (input >> temp)
    		{
                // 如果是字符“nan”,则输入nan("");否则输入数据
    			if (temp == "nan")
    			{
    				pic.push_back(nan(""));
    			}
    			else {
    				pic.push_back(atof(temp.c_str()));
    			}
    			col++;
    		}
    	}
        // result当前是n*1的矩阵,number是n的大小
    	int number = result.rows;
        // col是之前计算一行数据的长度,也就是列数,number/col得到的就是行数
    	int row = number / col;
        // reshape变换成正常row*col的矩阵
    	result=pic.reshape(row, col);
        // 关闭
    	infile.close();
        // 返回图像矩阵
    	return result;
    }
    

    C++测试代码

    #include<iostream>
    #include<fstream>
    #include<opencv2/opencv.hpp>
    using namespace std;
    
    void WritePicToExcel(string name, cv::Mat pic);
    cv::Mat ReadPicFromExcel(string name);
    int main()
    {
    	cv::Mat pic = cv::Mat::zeros(1000, 1000, CV_32FC1);
    	for (int i = 0; i < pic.rows; i++)
    	{
    		for (int j = 0; j < pic.cols; j++)
    		{
    			pic.at<float>(i, j) = rand() % 255;
    		}
    	}
    	pic.at<float>(1, 2) = nan("");
    	WritePicToExcel("test1.xls", pic);
    	cv::Mat result = ReadPicFromExcel("test1.xls");
    	return 0;
    }
    
    void WritePicToExcel(string name, cv::Mat pic)
    {
    	CV_Assert(pic.type() == CV_32FC1);
    	ofstream outfile(name);
    	int row = pic.rows;
    	int col = pic.cols;
    	for (int i = 0; i < row; i++)
    	{
    		float *p = pic.ptr<float>(i);
    		for (int j = 0; j < col; j++)
    		{
    			if (p[j] == p[j])
    			{
    				outfile << p[j] << (j == (col - 1) ? '\n' : '\t');
    			}
    			else {
    				outfile << "nan" << (j == (col - 1) ? '\n' : '\t');
    			}
    			
    		}
    	}
    	outfile.close();
    }
    
    cv::Mat ReadPicFromExcel(string name)
    {
    	cv::Mat result,pic;
    	ifstream infile(name);
    	string str;
    	int col = 0;
    	while (getline(infile, str))
    	{
    		string temp;
    		stringstream input(str);
    		col = 0;
    		while (input >> temp)
    		{
    			if (temp == "nan")
    			{
    				pic.push_back(nan(""));
    			}
    			else {
    				pic.push_back(atof(temp.c_str()));
    			}
    			col++;
    		}
    	}
    	int number = result.rows;
    	int row = number / col;
    	result=pic.reshape(row, col);
    	infile.close();
    	return result;
    }

    测试效果

    图1 随机生成的图像矩阵
    图2 保存效果图
    图3 读取效果

           如上图所示,为了方便,我随机生成了一个1000*1000的图像矩阵,并定义了第二行第三列的点为nan值,保存效果如图2所示,成功;再用加载数据的函数,得到的result同之前的pic一致。

           如果函数有什么可以改进完善的地方,非常欢迎大家指出,一同进步何乐而不为呢~

           如果文章帮助到你了,可以点个赞让我知道,我会很快乐~加油!

    展开全文
  • 提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并以及背景色,字体颜色的填充,...

    提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并以及背景色,字体颜色的填充,文本内容的对齐方式等)。

    实现思路:

    首先在springBoot(或者SpringCloud)项目的默认templates目录放入提前定义好的Excel模板,然后在具体的导出接口业务代码里通过IO流加载到这个Excel模板文件,读取指定的工作薄(也就是excel左下角的Sheet),接着给模板里的指定表头填充表头数据,接着读取数据库的相关数据用数据传输模型(DTO)封装数据,最后循坏填充excel的数据行(逐行逐列的填充数据),最后把填充完数据的Excel文件流输出(下载),即完成了数据库数据按照指定Excel模板导出Excel的完整过程。废话不多说,下面直接上代码。

    一、配置POI框架的依赖

    本案例是maven项目,解析Excel采用市面主流的POI框架,在pom.xml文件添加POI框架的依赖

    <!--读取excel文件,配置POI框架的依赖-->
    <dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>poi</artifactId>
    	<version>3.17</version>
    </dependency>
    <dependency>
    	<groupId>org.apache.poi</groupId>
    	<artifactId>poi-ooxml</artifactId>
    	<version>3.17</version>
    </dependency>

    二、放入excel模板文件

    目录结构如下所示:

    二、导出excel具体实现

    @RestController
    @RequestMapping("/excel")
    public class ExcelExportController {
    
    	
      @RequestMapping(value="/excelExport")
      public ResponseEntity<Resource> excel2007Export(HttpServletResponse response,HttpServletRequest request) {
       try {
         ClassPathResource cpr = new ClassPathResource("/templates/"+"student.xlsx");
         InputStream is = cpr.getInputStream();
    	 Workbook workbook = new XSSFWorkbook(is);
    	 org.apache.poi.ss.usermodel.Sheet sheet0 =workbook.getSheetAt(0);
    	 Row row = sheet0.getRow(2);
    	 Cell cell0 = row.getCell(0);
    	 Cell cell1 = row.getCell(1);
    	 Cell cell2 = row.getCell(2);
    	 cell0.setCellValue("guo");
    	 cell1.setCellValue("bin");
    	 cell2.setCellValue("hui");
    	 System.out.println(cell0);
    	 //这里作为演示,造几个演示数据,模拟数据库里查数据
    	 List <Student> list =  new ArrayList<Student>();
    	Student st1 = new Student();
    	Student st2 = new Student();
    	st1.setName("张三");
    	st1.setScore("87");
    	st1.setClass("一班");
    	st2.setName("张四");
    	st2.setScore("57");
    	st2.setClass("二班");
    	list.add(st1);
    	list.add(st2);
    	for(int i = 0;i<list.size();i++){
    		Row row = sheet0.getRow(i+3);//从第三行开始填充数据
    		row.setCellValue(list.get(i).getName());
    		row.setCellValue(list.get(i).getScore());
    		row.setCellValue(list.get(i).getClass());
    	}
    	String fileName = "moban.xlsx";
    	downLoadExcel(fileName, response, workbook);
    			
    	} catch (FileNotFoundException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	} catch (IOException e) {
    		// TODO Auto-generated catch block
    		e.printStackTrace();
    	}
        return new ResponseEntity<Resource>(HttpStatus.OK);
    }
    	
    public static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) {
    	try {
    		response.setCharacterEncoding("UTF-8");
    		response.setHeader("content-Type", "application/vnd.ms-excel");
    		response.setHeader("Content-Disposition",
    					"attachment;filename=\"" + URLEncoder.encode(fileName, "UTF-8") + "\"");
    		workbook.write(response.getOutputStream());
    	} catch (IOException e) {
    		e.printStackTrace();
    	}
       }
    }

    欢迎各位开发者朋友一起交流。笔者电话(微信):18629374628

    展开全文
  • matlab无法正常加载excel

    万次阅读 2017-09-07 14:07:47
    问题1:matlab读取excel错误  matlab利用xlsread读取xls时,出现如下错误:    解决方法:(1)找到excel安装目录下的exe文件,以管理员身份运行。    (2)选择“excel选择”

    问题1:matlab读取excel错误

               matlab利用xlsread读取xls时,出现如下错误:

          

               解决方法:(1)找到excel安装目录下的exe文件,以管理员身份运行。

                                  

                                 (2)选择“excel选项”

                                 

                                (3)选择“加载项”,管理选择“COM加载项”,然后点击“转到”

                                 

                                 (4)去掉复选框中所有打钩,点击“确定”。

                                  

    问题2:matlab无法写入excel

                  matlab利用xlswrite写入xls文件时,出现如下错误:

                 

                 解决方法:wps与office冲突。卸载wps。

                

    展开全文
  • MFC加载EXCEL代码

    千次阅读 2012-05-27 20:09:50
    一直以来就对EXCEL的各种功能很崇拜,后来经常使用VC,由于工作的需要,经常会遇到将文本文件中的庞大数据提取到Excel中运算处理。这个工作量可谓是劳民伤财,但是又不可不做,于是使用最简单的数据流(fscanf(), ...









    9:09|  分类: 默认分类|字号 订阅

    一直以来就对EXCEL的各种功能很崇拜,后来经常使用VC,由于工作的需要,经常会遇到将文本文件中的庞大数据提取到Excel中运算处理。这个工作量可谓是劳民伤财,但是又不可不做,于是使用最简单的数据流(fscanf(), fprintf()之类)书写文本格式的Excel文件,其弱智程度我就不说了。。。
    但是随着数据量的增大,这种方法每次都要处理不兼容问题,十分繁琐。于是探索如何按照Excel的数据格式写文件,解决兼容性问题。查询了各种资料,MSDN也看了很多,最后终于成功了。哈哈!!!
    好吧,现在就来说说这个鬼东西如何操作。首先,我对VC++高深的架构,接口,数据类型了解的并不多,这与绝大多数人是相同的。随意很多东西都是只管拿来用,只要不出问题,就不去想他。闲话少说,现在就开始。

    1。首先按照常规的方式建立对话框的MFC应用程序,然后添加类,也就是我们需要进行数据处理的类。由于只涉及到字符转换和数字提取,我建的是常规类,没有基类。

    2。既然要使用EXCEL的各种功能,那么就必须包含EXCEL的类文件(excel.h, excel.cpp)。晚上有大把教程告诉我们如何从excel的OBJ文件或者EXE文件提取源文件。这里不再叙述,反正我很早以前提取过office 2003的,就一直在用。

    3。如果我们看Excel的头文件(excel.h)会发现里面有大量的数据类型是我们不常使用的。因此如果要直接套用这些函数,就必须做数据类型转换,我这里使用了com库的接口,至于原理什么的不清楚。

    4。首先我们需要特别说明一个数据类型,这一个数据类型在Excel操作中反复用到,就是 VARIANT 类型。这是一个结构体,里面包含了大量的数据类型,其定义如下:
    struct tagVARIANT {
        union {
            struct __tagVARIANT {
                VARTYPE vt;
                WORD    wReserved1;
                WORD    wReserved2;
                WORD    wReserved3;
                union {
                    ULONGLONG     ullVal;       /* VT_UI8               */
                    LONGLONG       llVal;         /* VT_I8                */
                    LONG                 lVal;          /* VT_I4                */
                    BYTE                  bVal;        /* VT_UI1               */
                    SHORT               iVal;         /* VT_I2                */
                    FLOAT         fltVal;       /* VT_R4                */
                    DOUBLE        dblVal;       /* VT_R8                */
                    VARIANT_BOOL  boolVal;      /* VT_BOOL              */
                    _VARIANT_BOOL bool;         /* (obsolete)           */
                    SCODE         scode;        /* VT_ERROR             */
                    CY            cyVal;        /* VT_CY                */
                    DATE          date;         /* VT_DATE              */
                    BSTR          bstrVal;      /* VT_BSTR              */
                    IUnknown *    punkVal;      /* VT_UNKNOWN           */
                    IDispatch *   pdispVal;     /* VT_DISPATCH          */
                    SAFEARRAY *   parray;       /* VT_ARRAY             */
                    BYTE *        pbVal;        /* VT_BYREF|VT_UI1      */
                    SHORT *       piVal;        /* VT_BYREF|VT_I2       */
                    LONG *        plVal;        /* VT_BYREF|VT_I4       */
                    LONGLONG *    pllVal;       /* VT_BYREF|VT_I8       */
                    FLOAT *       pfltVal;      /* VT_BYREF|VT_R4       */
                    DOUBLE *      pdblVal;      /* VT_BYREF|VT_R8       */
                    VARIANT_BOOL *pboolVal;     /* VT_BYREF|VT_BOOL     */
                    _VARIANT_BOOL *pbool;       /* (obsolete)           */
                    SCODE *       pscode;       /* VT_BYREF|VT_ERROR    */
                    CY *          pcyVal;       /* VT_BYREF|VT_CY       */
                    DATE *        pdate;        /* VT_BYREF|VT_DATE     */
                    BSTR *        pbstrVal;     /* VT_BYREF|VT_BSTR     */
                    IUnknown **   ppunkVal;     /* VT_BYREF|VT_UNKNOWN  */
                    IDispatch **  ppdispVal;    /* VT_BYREF|VT_DISPATCH */
                    SAFEARRAY **  pparray;      /* VT_BYREF|VT_ARRAY    */
                    VARIANT *     pvarVal;      /* VT_BYREF|VT_VARIANT  */
                    PVOID         byref;        /* Generic ByRef        */
                    CHAR          cVal;         /* VT_I1                */
                    USHORT        uiVal;        /* VT_UI2               */
                    ULONG         ulVal;        /* VT_UI4               */
                    INT           intVal;       /* VT_INT               */
                    UINT          uintVal;      /* VT_UINT              */
                    DECIMAL *     pdecVal;      /* VT_BYREF|VT_DECIMAL  */
                    CHAR *        pcVal;        /* VT_BYREF|VT_I1       */
                    USHORT *      puiVal;       /* VT_BYREF|VT_UI2      */
                    ULONG *       pulVal;       /* VT_BYREF|VT_UI4      */
                    ULONGLONG *   pullVal;      /* VT_BYREF|VT_UI8      */
                    INT *         pintVal;      /* VT_BYREF|VT_INT      */
                    UINT *        puintVal;     /* VT_BYREF|VT_UINT     */
                    struct __tagBRECORD {
                        PVOID         pvRecord;
                        IRecordInfo * pRecInfo;
                    } __VARIANT_NAME_4;         /* VT_RECORD            */
                } __VARIANT_NAME_3;
            } __VARIANT_NAME_2;

            DECIMAL decVal;
        } __VARIANT_NAME_1;
    };
    VARIANT数据结构包含两个域(如果不考虑保留的域)。vt域描述了第二个域的数据类型。为了使多种类型能够在第二个域中出现,我们定义了一个联合结构。所以,第二个域的名称随着vt域中输入值的不同而改变。用于指定vt域值情况的常量在联合的定义中以每一行的注释形式给出。
    使用VARIANT和VARIANTARG数据结构要分两步完全。举一个例子,让我们考虑如下代码:

    long lValue = 999;
    VARIANT vParam;
    vParam.vt = VT_I4;
    vParam.lVal = lValue;
    在第一行中指定数据类型。常量VT_I4表明在第二个域中将出现一个long型的数据。根据类型VARIANT的定义,可以得知,当一个long型数据存入VARIANT类型时,其第二个域使用的名称是lVal。

    5。了解了VARIANT数据类型,我们还需要了解一个函数,我实在微软的官网查到这个函数的,网上讲解的不是很全面,我大概说下,基本上是照猫画虎,原理什么的都不懂的。这个函数就是AutoWrap()函数。可能很多人都在网上查到过这个函数,但是其工作原理不是很清楚,我觉得没必要全懂,只要理解两句就足够了。
    HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...)
    {
        // Begin variable-argument list...
        va_list marker;
        va_start(marker, cArgs);

        if(!pDisp) 
    {
            MessageBox(NULL, _T("NULL IDispatch passed to AutoWrap()"), _T("Error"), 0x10010);
            _exit(0);
        }

        // Variables used...
        DISPPARAMS dp = { NULL, NULL, 0, 0 };
        DISPID dispidNamed = DISPID_PROPERTYPUT;
        DISPID dispID;
        HRESULT hr;
        char buf[200];
        char szName[200];

        // Convert down to ANSI
        WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

        // Get DISPID for name passed...
        hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
        if(FAILED(hr)) 
    {
            sprintf(buf, "IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx", szName, hr);
            MessageBox(NULL, buf, L"AutoWrap()", 0x10010);
            _exit(0);
            return hr;
        }

        // Allocate memory for arguments...
        VARIANT *pArgs = new VARIANT[cArgs+1];
        // Extract arguments...
        for(int i=0; i<cArgs; i++) 
    {
            pArgs[i] = va_arg(marker, VARIANT);
        }

        // Build DISPPARAMS
        dp.cArgs = cArgs;
        dp.rgvarg = pArgs;

        // Handle special-case for property-puts!
        if(autoType & DISPATCH_PROPERTYPUT) 
    {
            dp.cNamedArgs = 1;
            dp.rgdispidNamedArgs = &dispidNamed;
        }

        // Make the call!
        hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
        if(FAILED(hr)) 
    {
            sprintf(buf, "IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx", szName, dispID, hr);
            MessageBox(NULL, buf, "AutoWrap()", 0x10010);
            _exit(0);
            return hr;
        }
        // End variable-argument section...
        va_end(marker);

        delete [] pArgs;

        return hr;
    }
    其实这个函数的作用,就是将特定字符串转换成Excel命令,然后调用Invoke函数对相应数据进行处理。详细说来:
    (1)。int autoType:这里只能有4个值,表示Invoke如何处理相关数据。在OLEAUTO.h文件中定义如下:
    /* Flags for IDispatch::Invoke */
    #define DISPATCH_METHOD         0x1
    #define DISPATCH_PROPERTYGET    0x2
    #define DISPATCH_PROPERTYPUT    0x4
    #define DISPATCH_PROPERTYPUTREF 0x8
    这里面我用了前面三个,主要的是中间的两个。
    (2)。VARIANT *pvResult:Invoke处理完数据后的返回指针,指向处理结果,后面我们看到就是子函数的返回值
    (3)。 IDispatch *pDisp:一个指针,用于调用DISPID方法,其实就是只调用个两个方法,即在特定层次下,将特定字符串转换成命令值,然后执行命令
    (4)。LPOLESTR ptName:就是一直在说的特定字符串
    (5)。int cArgs...:命令参数个数,由于是模板函数,所以后面可跟更多的参数。

    好的,我们把参数都解释了一下,那么函数中有两个特殊语句我们再说一下:
    (1)。hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID)
    这个函数在微软官网上面有,但是我相信很多人没看懂。如果我们把后面的一个语句放到一块,就比较轻松了:
    hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
    我们可以打开我们的工程中的excel.cpp文件,随便找一个函数:
    LPDISPATCH CalloutFormat::GetParent()
    {
    LPDISPATCH result;
    InvokeHelper(0x1, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&result, NULL);
    return result;
    }
    这里面的InvokeHelper()可以看做与Invoke()相同。所以第一个参数是一个十六进制的数,每个函数这个十六进制的数都不同,所以简单来说,GetIDsOfNames函数就是将我们的特殊字符串转换成命令值。我们后面可知,这个特殊字符串实际上只能是Excel相关的函数名或者部分函数名(这个比较难理解,可以先放下,后面会举例)。
    所以GetIDsOfNames最后只得到了一个int类型的值dispID,用以Invoke()函数的执行。
    (2)。hr = pDisp->Invoke(disIpD, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
    这个函数就解释一句话:根据定义的运行类型(autotype),特定的参数(dp),运行特定的命令值(disIpD),得到运行结果(pvResult)和运行状态(hr )。如果hr不等于0,就说明运行失败。
    其实这个语句跟函数的意思是相同的,只是方式改变了而已。

    所以这个函数:
    HRESULT AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...)
    的意思就是,我们可以直接通过直接写一个函数名称(或者部分函数名称),添加相关参数(实参)后,就可以实现通常语法的函数功能,比如如下程序段:
    例 1:
    //select LineNum x RowNum range
    IDispatch *pXlRange;
    {
    VARIANT parm;
    parm.vt = VT_BSTR;
    parm.bstrVal = ::SysAllocString(bstr_Range_Str);

    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
    VariantClear(&parm);
    pXlRange = result.pdispVal;
    }
    这个语句段是调用pXlSheet.GetRange(Range)这个函数里面的Invokehelper(),实际我们可以理解为就是在调用pXlSheet.GetRange(Range)函数。
    可能有人会问:里面的字符串是"Range",为什么函数本体是GetRange()哪?
    我们看第一个参数:DISPATCH_PROPERTYGET,这表示我们需要Get相关的命令值(输出),所以就是GetRange()了
    如果是DISPATCH_PROPERTYPUT, 就表示此时命令值作为输入要去改变部分参数,所以就是SetRange()了
    如果是DISPATCH_METHOD,则在写字符串时,需要写函数的完整名称。

    我们只要一个完整的函数包括形参和返回值,那在AutoWrap()中实参怎么传递给形参哪?
    这个就是int cArgs...的妙处,cArgs是一个int类型,表示需要传递的实参的数目,而cArgs后面的参数就都是要传递给函数的实参了。
    我们可以看看Excel.h文件,里面的函数传递的参数各不相同,有的没有参数,有的有十几个参数。那我们要使用一个函数解决这所有的问题,就要使用如此的函数模板了。.如上面的例1。
    特别需要说明的一点:如果你需要传递多个参数,参数的顺序是反向的:SetItem(parm1, parm2, parm3, parm4)。则在AutoWrap(。。。。。。,L"Item", 4, parm4, parm3, parm2, parm1)。

    6。如果以上内容都理解了(我说的可能有不对的地方,不过你们看了下面的例子应该就会明白),我们就开始正式些程序了:
    (1)在我们刚才建好的工程中添加文件:excel.h,excel.cpp
    (2)在我们新建的那个类DatalogConvertor的cpp文件中添加:
    #include <ole2.h>       //需要调用OLE方法
    #include <comutil.h>   //需要调用com接口

    #pragma once
    #pragma comment(lib,   "comsupp.lib ")  //调用Com库

    添加 HRESULT CDatalogConvertor::AutoWrap(int autoType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...)函数,就把上面的代码黏贴进去即可。

    (3)在你的excel操作函数中开始启动Excel进程,Excel采用层次化编程,如果我们要在Excel的一个sheet上写数据,就要先开启进程,建立工作薄,在工作薄中添加一个工作页,激活此工作页(Sheet),之后才可以进行写入操作。
    //initial COM lib
    CoInitialize(NULL);

    CLSID clsid;
    HRESULT hr = CLSIDFromProgID(L"Excel.Application", &clsid);

    if(FAILED(hr)) 
    {
    ::MessageBox(NULL, "CLSIDFromProgID() function error\nEXCEL Not Be Installed!", "error", 0x10010);
    //::MessageBox(NULL, "CLSIDFromProgID() function error!", "error", 0x10010);
    return -1;
    }

    // creat instance
    IDispatch *pXlApp;
    hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pXlApp);
    if(FAILED(hr)) 
    {
    ::MessageBox(NULL, "Pls check whether setuped EXCEL!", "error", 0x10010);
    return -2;
    }
    // Application.Visible is ture
    VARIANT IsVisible;
    IsVisible.vt = VT_I4;
    IsVisible.lVal = 0; //0=not visible, 1=visible
    AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlApp, L"Visible", 1, IsVisible);

    //get WorkBooks
    IDispatch *pXlBooks;
    {
    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"Workbooks", 0);
    pXlBooks = result.pdispVal;
    }

    //create new Workbook using Workbook.Add() method
    IDispatch *pXlBook;
    {
    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlBooks, L"Add", 0);
    pXlBook = result.pdispVal;
    }

    //get Worksheet object from Application.ActiveSheet attribute
    IDispatch *pXlSheet;
    {
    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlApp, L"ActiveSheet", 0);
    pXlSheet = result.pdispVal;
    }
    到这里我们顺利启动了Excel并且创建了工作薄,得到了当前的工作页。我们要写数据进去,就有两种方法:一个是一个单元一个单元的写(Cell),还有一个就是选定一个范围(Range),然后一个特定格式的数组进行添加。我这里面选取的是Range。
    //fill excel file function
    int CDatalogConvertor::FillExcel(IDispatch *pXlSheet, int LineStart, int LineNum, int RowStart, int RowNum, CString Data[], int flag)
    {
    int i, j;
    int data_flag;

    //***create a LineNum x RowNum arrary to fill excel format***//
    VARIANT arr;
    WCHAR szTmp[128];
    arr.vt = VT_ARRAY | VT_VARIANT;
    SAFEARRAYBOUND sab[2];

    sab[0].lLbound = 1; sab[0].cElements = LineNum;
    sab[1].lLbound = 1; sab[1].cElements = RowNum;
    arr.parray = SafeArrayCreate(VT_VARIANT, 2, sab);

    //***Convert string to BSTR and fill the data into the array***//
    BSTR bstrData[128][64]={0};

    for(i=0;i<LineNum;i++)
    {
    for(j=0;j<RowNum;j++)
    {
    //Convert string to BSTR
    bstrData[i][j]=_com_util::ConvertStringToBSTR(Data[i+j]);
    VARIANT tmp;
    tmp.vt = VT_BSTR;
    wsprintfW(szTmp,bstrData[i][j],i,j);
    tmp.bstrVal = SysAllocString(szTmp);
    //fill the data into the array
    long indices[]={i+1,j+1};
    SafeArrayPutElement(arr.parray,indices,(void *)&tmp);
    }
    }

    //Math Line Number and Row Number for excel range and array
    char Row_Start = (char) (RowStart+64); //convert 1 to A
    char Row_Stop  = Row_Start+RowNum-1;
    CString Range_Str, LineStart_Str, LineStop_Str;
    BSTR bstr_Range_Str;

    LineStart_Str.Format("%d", LineStart);
    LineStop_Str.Format("%d", LineStart+LineNum-1);
    Range_Str = _T(Row_Start)+LineStart_Str+_T(":")+_T(Row_Stop)+LineStop_Str;
    bstr_Range_Str = _com_util::ConvertStringToBSTR(Range_Str);

    //select LineNum x RowNum range
    IDispatch *pXlRange;
    {
    VARIANT parm;
    parm.vt = VT_BSTR;
    parm.bstrVal = ::SysAllocString(bstr_Range_Str);

    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
    VariantClear(&parm);
    pXlRange = result.pdispVal;
    }

    //fill the Range by our array
    AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);
    pXlRange->Release();

    return 0;
    }
    这个函数里面最后的AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"Value", 1, arr);
    就是将数组填写进相关的Range中。

    (4)写完了数据后就要保存文件退出Excel进程:
      //*****************************************************//save Excel file and quit excel.exe//*****************************************************//save excel file through Worksheet.SaveAs(), ignore all parameter expect filemname.VARIANT filename;filename.vt = VT_BSTR;filename.bstrVal = SysAllocString(_com_util::ConvertStringToBSTR(FileSaveName)); AutoWrap(DISPATCH_METHOD, NULL, pXlSheet, L"SaveAs", 1, filename);SysFreeString(filename.bstrVal);// exit EXCEL app through Application.Quit()AutoWrap(DISPATCH_METHOD, NULL, pXlApp, L"Quit", 0);//release all parameter//pXlRange->Release();pXlSheet->Release();pXlBook->Release();pXlBooks->Release();pXlApp->Release();//VariantClear(&arr);//*********************************************************//close files//*********************************************************//close COM libCoUninitialize();

    (5)如果我们除了写数据意外还想做点其他的操作,如改变字体格式,颜色,填充颜色,设置宽度,甚至更高阶的功能,不用着急,AutoWrap()的功能弄清楚之后就很容易:
    CString cstr_Line, cstr_Range;
    BSTR    bstr_Range;
    cstr_Line.Format("%d",data_line);
    cstr_Range = _T("A")+cstr_Line+_T(":")+_T("A")+cstr_Line;
    bstr_Range = _com_util::ConvertStringToBSTR(cstr_Range);
    //select LineNum x RowNum range 得到Range
    IDispatch *pXlRange;
    {
    VARIANT parm;
    parm.vt = VT_BSTR;
    parm.bstrVal = ::SysAllocString(bstr_Range);

    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlSheet, L"Range", 1, parm);
    VariantClear(&parm);
    pXlRange = result.pdispVal;
    }
    //Set Column Width object form Range.SetColumnWidth() attribute
    //设置此部分Range的列宽度
    {
    VARIANT parm;
    parm.vt = VT_I4;
    parm.lVal = 40.0;
    AutoWrap(DISPATCH_PROPERTYPUT, NULL, pXlRange, L"ColumnWidth", 1, parm);
    }
    //get Font object from Range.GetFont() attribute
    //得到相应Range内默认的字体属性
    IDispatch *pXlFonts;
    {
    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlRange, L"Font", 0);
    pXlFonts = result.pdispVal;
    }
    //Set Font object from Range.SetColor() attribute
    //设定字体颜色
    IDispatch *pXlFont;
    {
    VARIANT result;
    VariantInit(&result);
    VARIANT parm;
    parm.vt = VT_I4;
    parm.lVal = RGB(255,0,0); //red color
    AutoWrap(DISPATCH_PROPERTYPUT, &result, pXlFonts, L"Color", 1,parm);
    pXlFont = result.pdispVal;
    }
    //get Interior object from Range.GetInterior() attribute
    //得到相应Range内的框体默认属性
    IDispatch *pXlInterior;
    {
    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_PROPERTYGET, &result, pXlRange, L"Interior", 0);
    pXlInterior = result.pdispVal;
    }
    //Set Back Color object from Interior.SetColor() attribute
    //设定框体背景颜色
    IDispatch *pXlBackColor;
    {
    VARIANT result;
    VariantInit(&result);
    VARIANT parm;
    parm.vt = VT_I4;
    parm.lVal = RGB(140,227,190); //blue back color
    AutoWrap(DISPATCH_PROPERTYPUT, &result, pXlInterior, L"Color", 1,parm);
    pXlBackColor = result.pdispVal;
    }
    所以只要想添加什么功能,在Excel.h文件中找到相关的函数,根据函数名和参数类型,定制AutoWrap()函数,代码会变得很清晰整洁。同时据微软官网说,这也会是代码执行效率提高很多(不知是真是假。。)
    展开全文
  • ArcGIS中加载Excel点位数据(包含坐标位置信息、value值),该数据格式以Excel 97-2003工作簿.xls并无问题,但是数据格式以.xlsx却出现如下故障: 解决思路: 将.xlsx数据格式转换为.xls数据格式,问题顺利解决...
  • 使用Excel.dll来加载Excel会遇到一个大坑,那就是在编辑器下一切都没有问题,但是发布成pc端的exe后,加载Excel就出问题了。(目前只在pc上做过实验,ios,android,mac效果未知)。 遇到的问题主要是加载07版以后的...
  • matlab加载excel表格提示服务器出错解决(图文) 本来怀疑和matlab版本有关系,其实然并卵。 万能的百度告诉我,这是小病,吃点药就行,别总嚷嚷的要开刀。哈哈哈 下面是matlab命令行报错: 解决方法: 1、...
  • 之所以不能加载是因为我选中了该表sheet1但是没双击或者勾选,导致软件并不认为你选中了,所以加载的选项还是灰色的。可以通过多尝试其它文件/方法、甚至推导重来来发现自己的问题。 勾选以后加载就显示了: ...
  • cocos creator如何加载excel等文本文件

    千次阅读 2019-04-18 16:32:26
    随着游戏技术的日新月异,玩家对游戏...我们的前辈已经给出了答案,因为cocos creator是可以支撑json文件动态加载的,所有我们仅需要将excel等文本文件转换为json文件,然后运用cocos creator进行动态加载便行了。 ...
  • 在透视表管理模型数据时,出现错误“我们无法加载Power Pivot加载项”。 解决办法: 通过控制面板——程序与功能——找到对应的OFFICE程序——更改——修复 建议使用“联机修复”,“快速修复”不解决...
  • 用poi,加载excel模板导出数据

    千次阅读 2016-06-15 11:52:58
    上一篇博客是用jxl来生成类似模板文件的excel. 下面的代码,是根据模板excel,来导出带有数据的excel package com; import java.io.FileInputStream; import java.io.FileOutputStream; import org.apache.poi....
  • 加载Excel文件 常用于加载模板 /// /// 加载已存在的Excel文件 不能加载受密码保护的文件 /// /// 文件名称 /// <param name="version"></param> public void LoadFromFile...
  • matlab 加载excel数据

    2013-07-01 16:24:57
    importdata是非常好用的命令,它可以txt,xls等加载数据, 例如:A=importdata('filename.txt') A=importdata('filename.xls') 假如是txt文本,既有字符又有数据可以用 A.data显示数据,A.textdata显示字符 假如是...
  • 先发一下第一版速度超级慢的代码: 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
  • 1、为什么要使用NPOI导出Excel? 一、解决传统操作Excel遇到的问题: 如果是.NET,需要在服务器端装Office,且及时更新它,以防漏洞,还需要设定权限允许.NET访问COM+,如果在导出过程中出问题可能导致...
  • 添加或删除Excel2010加载

    千次阅读 2014-12-11 14:46:53
    ★激活Excel加载项    单击“文件”选项卡,单击“选项”,然后单击“加载项”类别。在“管理”框中,单击“Excel加载项”,然后单击“转到”。此时将显示“加载项”对话框,在“可用加载项”框中,选中要激活的...
  • 在我们使用pandas加载数据表格时,为了更加方便地观察数据的情况,我们一般会在程序中把数据表格打印,实现数据的可视化。但pandas显示数据表格默认只显示50行。如下所示: import pandas as pd data = pd.read_...
  • 可能大家在学习的过程中会拿到一些带有坐标点的空间数据,那我们就想看一下这些坐标点是如何分布的,今天我们就来分享如何在ArcGIS中加载excel、txt、csv数据,文末附视频教程和练习数据。 我们提供的数据分别是餐饮...
  • 一:先将1.xlsx转换成1.csv格式的excel文件,因为csv默认以逗号分隔列数据,而且使用双引号引起没列数据,很好,字符集不设置也可以正常导入汉字,呵呵,如果直接导入1.xlxs文件,而且设置相关编码,相关分隔符,都...
  • excel2007加载宏的两种方法

    千次阅读 2016-04-28 13:49:34
    excel2007加载宏在哪里,为什么需要使用加载宏,比如一些内置函数完成不了我们的最终目标,或者是低版本,比如2003版某些函数需要加载宏才能使用等等。对Excel感兴趣的朋友可加Excel学习交流群:284029260  又如在...
  • Excel VBA 加载图片

    千次阅读 2011-10-26 16:25:56
    Sub 添加图片() On Error Resume Next  Dim lujing As String  For i = 1 To 11  For j = 1 To 20  lujing = ThisWorkbook.Path & "\影相\" & Sheet2.Cells(j, i).Value & ".jpg" ... With Sheet2
  • 使用Pandas,加载并查询Excel文件
  • 由于windows加载本地文件和linux加载本地文件有区别,所以在加载本地文件时,...InputStream in = ExcelUtils.class.getClassLoader().getResourceAsStream("classpath:templates/userTemp.xlsx"); XSSFWorkbook wb...
  • Excel 2007 规划求解加载项的导入

    千次阅读 2018-05-12 17:04:37
    方法/步骤打开Excel2007工作文件——&gt;【鼠标左键】单击【Microsoft office】按钮——&gt;【鼠标左键】单击【Excel 选项】按钮;再在弹出的【加载宏】方框下——&gt;【鼠标左键】勾选【规划求解...
  • 我用C++写了一个EXCEL的XLL加载项,使用了VS2008中的MD模式。 在绝大多数机器上,只要我先安装vs2008 runtime,就可以成功加载,但有的机器,即使安装上述runtime或VS后,也不能够成功加载。 请问这是什么原因,有...
  • excel数据分析需要的加载宏文件,为无光盘的office软件使用者提供方便!
  • Excel 2003今天下午,想琢磨以下Excel加载宏里的那些工具,把所有的宏都给选上了.这下可好,关掉Excel再打开,Excel就动静了,连续好几次都不行开始还不知道是加载了过多宏的问题,还以为自己的系统有问题了(可能是有点...
  • 有一个现成的Excel文件,文件打开后,里面有加载项程序, 这个程序可能是他人写来实现特定功能的, 但是因为要对Excel表格内容做调整,所以对应的程序也要做一定的修改。 点击加载项 可以看到,这个加载项的功能...
  • Microsoft Excel 2010 - 加载数据分析工具

    千次阅读 2017-12-05 23:11:47
    Microsoft Excel 2010 - 加载数据分析工具 1. 打开EXCEL,文件 -> 选项 2. 加载项 -> 转到… 3. 分析工具库、分析工具库 - VBA 4. 打开EXCEL,数据 -> 数据分析

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 56,799
精华内容 22,719
关键字:

从网站加载excel