注册 登录
编程论坛 VFP论坛

关于libxl 读取excel 的vfp的方法

ls_y041 发布于 2022-03-27 04:26, 5525 次点击
https://blog.
想实现一下vb 转vfp的代码请帮助落实一下谢谢
28 回复
#2
schtg2022-03-27 07:22
回复 楼主 ls_y041
我在ID大师那学习到了一点点儿,仅供参考哈
程序代码:
LoadLIBXL()

Book = xlCreateBookCA()
sheet = xlBookAddSheetA(Book, [stu] ,0)
* 写
xlSheetWriteStrA(sheet,1,1,[姓名],0)
xlSheetWriteStrA(sheet,1,2,[年龄],0)

xlSheetWriteStrA(sheet,2,1,[张三],0)
xlSheetWriteStrA(sheet,3,1,[李四],0)

xlSheetWriteNumA(sheet,2,2,22,0)
xlSheetWriteNumA(sheet,3,2,23,0)
* 读
? xlSheetReadStrA(sheet, 1 , 1 , 0)
? xlSheetReadNumA(sheet, 2 , 2 , 0)
* 存   
xlBookSaveA(BOOK,[测试.xls])
* 放
xlBookReleaseA(BOOK)



***
***
PROC LoadLIBXL

    DECLARE LONG    xlCreateBookCA         in libxl.dll
    DECLARE LONG    xlCreateXMLBookCA      in libxl.dll
                                                   
    DECLARE INTEGER xlBookLoadA            in libxl.dll LONG handle , STRING filename
    DECLARE INTEGER xlBookSaveA            in libxl.dll LONG handle , STRING filename
                                                   
    DECLARE LONG    xlBookAddSheetA        in libxl.dll LONG handle , STRING name , LONG initSheet

    DECLARE         xlBookReleaseA         in libxl.dll LONG handle
                                                   
    DECLARE STRING  xlSheetReadStrA        in libxl.dll LONG handle , INTEGER row , INTEGER col , LONG @format
    DECLARE INTEGER xlSheetWriteStrA       in libxl.dll LONG handle , INTEGER row , INTEGER col , STRING value , LONG format
                                                   
    DECLARE DOUBLE  xlSheetReadNumA        in libxl.dll LONG handle , INTEGER row , INTEGER col , LONG @format
    DECLARE INTEGER xlSheetWriteNumA       in libxl.dll LONG handle , INTEGER row , INTEGER col , DOUBLE value , LONG format
#3
吹水佬2022-03-27 10:31
libxl有无类似VBA的编程支持?
#4
ls_y0412022-03-27 14:02
这个是一个可以不安装EXCEL就可以实现写入数据的东西,目前只是知道在速度上飞快。但没有上手学习明白,谢谢!!!
#5
ls_y0412022-03-27 15:45
https://www.

Code example: generate a new spreadsheet from scratch

#include "libxl.h"


int main()
{
    BookHandle book = xlCreateBook(); // xlCreateXMLBook()
    if(book)
    {
        SheetHandle sheet = xlBookAddSheet(book, L"Sheet1");
        if(sheet)
        {
            xlSheetWriteStr(sheet, 2, 1, L"Hello, World !", NULL);
            xlSheetWriteNum(sheet, 3, 1, 1000, NULL);
        }
        xlBookSave(book, L"example.xls");
        xlBookRelease(book);
    }
    return 0;
}
#6
sostemp2022-03-27 18:04
只有本站会员才能查看附件,请 登录
#7
吹水佬2022-03-27 18:40
回复 6楼 sostemp
这个可以,DLL的API库,文件1M多点不大,提供了618个函数,不知有无版权问题?
#8
sostemp2022-03-28 09:47
回复 7楼 吹水佬
有版权的,在程序中Key一下就行了,否则生成的EXCEL文件有提示试用的一条显示的Created by LibXL trial version. Please buy the LibXL full version for removing this message.

#9
ls_y0412022-03-30 03:14
有那么多函数吗
#10
plsword2022-03-31 12:28
回复 8楼 sostemp
怎么key?
#11
plsword2022-03-31 12:28
以下是引用sostemp在2022-3-28 09:47:15的发言:

有版权的,在程序中Key一下就行了,否则生成的EXCEL文件有提示试用的一条显示的Created by LibXL trial version. Please buy the LibXL full version for removing this message.

能告知一下怎么在程序中key一下吗
#12
aqyejun2022-03-31 14:38
谢谢分享
#13
laowan0012022-03-31 15:45
以下是引用schtg在2022-3-27 07:22:06的发言:

我在ID大师那学习到了一点点儿,仅供参考哈
LoadLIBXL()

Book = xlCreateBookCA()
sheet = xlBookAddSheetA(Book, [stu] ,0)
* 写
xlSheetWriteStrA(sheet,1,1,[姓名],0)
xlSheetWriteStrA(sheet,1,2,[年龄],0)

xlSheetWriteStrA(sheet,2,1,[张三],0)
xlSheetWriteStrA(sheet,3,1,[李四],0)

xlSheetWriteNumA(sheet,2,2,22,0)
xlSheetWriteNumA(sheet,3,2,23,0)
* 读
? xlSheetReadStrA(sheet, 1 , 1 , 0)
? xlSheetReadNumA(sheet, 2 , 2 , 0)
* 存   
xlBookSaveA(BOOK,[测试.xls])
* 放
xlBookReleaseA(BOOK)



***
***
PROC LoadLIBXL

    DECLARE LONG    xlCreateBookCA         in libxl.dll
    DECLARE LONG    xlCreateXMLBookCA      in libxl.dll
                                                   
    DECLARE INTEGER xlBookLoadA            in libxl.dll LONG handle , STRING filename
    DECLARE INTEGER xlBookSaveA            in libxl.dll LONG handle , STRING filename
                                                   
    DECLARE LONG    xlBookAddSheetA        in libxl.dll LONG handle , STRING name , LONG initSheet

    DECLARE         xlBookReleaseA         in libxl.dll LONG handle
                                                   
    DECLARE STRING  xlSheetReadStrA        in libxl.dll LONG handle , INTEGER row , INTEGER col , LONG @format
    DECLARE INTEGER xlSheetWriteStrA       in libxl.dll LONG handle , INTEGER row , INTEGER col , STRING value , LONG format
                                                   
    DECLARE DOUBLE  xlSheetReadNumA        in libxl.dll LONG handle , INTEGER row , INTEGER col , LONG @format
    DECLARE INTEGER xlSheetWriteNumA       in libxl.dll LONG handle , INTEGER row , INTEGER col , DOUBLE value , LONG format

请问:如何输出为xlsx格式的表?
#14
nbwww2022-03-31 21:50
xlBookSaveA(BOOK,[测试.xls])      &&这个就是另存为
* 下面的为释放
xlBookReleaseA(BOOK)
#15
schtg2022-04-01 06:23
回复 13楼 laowan001
可用 xlCreateXMLBookCA 直接创建 xlsx 文档的哈
#16
laowan0012022-04-01 07:54
以下是引用schtg在2022-4-1 06:23:13的发言:

 可用 xlCreateXMLBookCA 直接创建 xlsx 文档的哈

我用下面的代码另存为测试.xlsx,执行正常,但打开EXCEL表时报告说格式不对,是我哪里写的不对了
注:测试.xls导出的表就可以正常打开,但是低版本
程序代码:

LoadLIBXL()

Book = xlCreateBookCA()
sheet = xlBookAddSheetA(Book, [stu] ,0)
* 写
xlSheetWriteStrA(sheet,1,1,[姓名],0)
xlSheetWriteStrA(sheet,1,2,[年龄],0)

xlSheetWriteStrA(sheet,2,1,[张三],0)
xlSheetWriteStrA(sheet,3,1,[李四],0)

xlSheetWriteNumA(sheet,2,2,22,0)
xlSheetWriteNumA(sheet,3,2,23,0)
* 读
? xlSheetReadStrA(sheet, 1 , 1 , 0)
? xlSheetReadNumA(sheet, 2 , 2 , 0)
* 存   
xlBookSaveA(BOOK,[测试.xlsx])
* 放
xlBookReleaseA(BOOK)


[此贴子已经被作者于2022-4-1 07:57编辑过]

#17
antony5212022-04-01 09:42
回复 16楼 laowan001
再仔细看看15楼
#18
laowan0012022-04-01 09:59
以下是引用antony521在2022-4-1 09:42:21的发言:

再仔细看看15楼

不好意思,是我马虎了,谢谢啦
#19
sam_jiang2022-04-05 15:02
foxpro有自己的解析excel文件的类啊,oexcel=createOBJECT("excel.application"),搞那么复杂干嘛。
#20
antony5212022-04-05 17:04
回复 19楼 sam_jiang
这个离不开excel.exe.
#21
laowan0012022-04-06 09:04
测试结果:10W条记录,每条记录50个字段,导出xlsx,18M,用时59秒
使用方法:xlSheetWriteNumA和xlSheetWriteStrA,逐个字段写入的,不知有没有批量写入的方法,比如数组复制(在函数列表中未发现)
问题:
1.有部分字段内容未写入(第一条8个字段,最后一条11个字段,其他未检查)
2.中间散落8处字段内容被改写为:Buy me !,猜想是因为没有key

[此贴子已经被作者于2022-4-6 09:08编辑过]

#22
easyppt2022-04-06 10:57
这个专题好,因为现在很多用户都是用WPS,他们不愿意安装 OFFICE EXCEL
laowan001 斑竹 能分享一下代码吗

希望斑竹们整理成出更多的例子,谢谢!  
#23
laowan0012022-04-06 15:35
以下是引用easyppt在2022-4-6 10:57:04的发言:

这个专题好,因为现在很多用户都是用WPS,他们不愿意安装 OFFICE EXCEL
laowan001 斑竹 能分享一下代码吗

希望斑竹们整理成出更多的例子,谢谢!  

我用的是2楼的代码,自己找了个数据源(记录数自己定),循环所有记录,写入每个单元格的内容即可
#24
厨师王德榜2022-04-11 12:13
这个库只能一个格子一个格子的读取吗?
如果已知起始行,起始列,可以一次性读取到数组/或json结构中吗?
如果只能一格一格的读取,那效率有点低啊.
#25
ls_y0412022-11-15 21:31
回复 2楼 schtg
想再问一下如何实现设置字体及边框的代码,谢谢!!
Option Explicit

Private Sub Form_Load()
On Error Resume Next

    Dim book As Long '存放操作Excel的指针
    Dim sheet As Long '存放操作当前sheet的指针

    '创建一个操作xls格式的Excel的一个实例(指针)
    book = xlCreateBook()     

    If book <> 0 Then
        '许可证绑定
        'license name:购买许可证的name
        'license key:购买许可证的key
        'Call xlBookSetKey(book,  "license name", "license key")
        
        '新增一个工作表sheet
        sheet = xlBookAddSheet(book, "Sheet1", 0)
        
        If sheet <> 0 Then
            '在新增的Sheet1中写入数据
            
            '在Sheet1的第三行第二列单元格写入字符串"Hello, World !"
            '(位置计算说明:3 = 2 + 1 , 2 = 1 + 1 )
            Call xlSheetWriteStr(sheet, 2, 1, "Hello, World !", 0)
            
            '在Sheet1的第四行第二列单元格写入数值123.456
            '(位置计算说明:4 = 3 + 1 , 2 + 1 + 1)
            Call xlSheetWriteNum(sheet, 3, 1, 123.456, 0)
        End If
        
        '在sheetindex = 0 的工作表(Sheet1)
        '前面插入一个工作表MySheet2
        sheet = xlBookInsertSheet(book, 0, "MySheet2", 0)
        
        '在sheetindex = 1 的工作表(Sheet1)
        '前面插入一个工作表MySheet3
        sheet = xlBookInsertSheet(book, 1, "MySheet3", sheet)
        
        '计算该Excel总共有多少个工作表(sheet)
        Dim sheetCnt As Integer: sheetCnt = xlBookSheetCount(book)
        Me.Caption = "SheetCount = " & sheetCnt
        
        '删除sheetindex = 1 的工作表(MySheet3)
        Call xlBookDelSheet(book, 1)
        
        '保存该Excel,并命名为"example.xls"
        Call xlBookSave(book, "example.xls")
        
        '释放操作Excel的资源
        Call xlBookRelease(book)

    End If

End Sub

#include <iostream>
#include "libxl.h"
#pragma comment(lib,"libxl.lib")
using namespace libxl;


 Book* book = xlCreateBook();//创建一个二进制格式的XLS(Execl97-03)的实例
 Book* book  xlCreateXMLBook();//创建一个XML格式的XLSX格式( Execl2007以上)的实例,返回该实例的指针。

int main()
{
    Book* book = xlCreateBook();//创建一个二进制格式的XLS(Execl97-03)的实例,在使用前必须先调用这个函数创建操作excel的对象
   // xlCreateXMLBook();//创建一个XML格式的XLSX格式( Execl2007以上)的实例,返回该实例的指针。
    //book->setKey(......);//如果购买了该库,则设置相应的key,若没有购买,则不用这行
    if (book)//是否创建实例成功
    {
        Sheet* sheet = book->addSheet(L"Sheet1");//添加一个工作表
        if (sheet)
        {
            sheet->writeStr(1, 1, L"Hello, World !");//在第二行 第二列的表格中写入字符串"Hello, World !"。程序中从0开始计数。第0行就是execl的第1行
            sheet->writeNum(2, 1, 1000);//在第三行 第二列的表格中写入数字 "1000"。
            sheet->writeNum(3, 1, 2000);

            Font* font = book->addFont();//创建一个字体对象
            font->setColor(COLOR_RED);  //设置对象颜色
            font->setBold(true);        //设置粗体
            Format* boldFormat = book->addFormat();//设置字体格式指针
            boldFormat->setFont(font);             //应用上面设置的字体
            sheet->writeFormula(6, 1, L"SUM(B3:B4)", boldFormat); //用新的字体格式 在第七行 B列 写入 B3(第三行,第二列)+B4 的和

            Format* dateFormat = book->addFormat();
            dateFormat->setNumFormat(NUMFORMAT_DATE);//设置日期格式,依赖于你本机的设置
            sheet->writeNum(8, 1, book->datePack(2019, 10, 29), dateFormat);

            sheet->setCol(1, 1, 12);//设置列宽,格式等
        }

        if (book->save(L"example.xls"))//保存到example.xls
        {
            //.....成功
        }
        else
        {
            std::cout << book->errorMessage() << std::endl;
        }
        book->release();//释放对象!!!!!
    }
    return 0;
}



[此贴子已经被作者于2022-11-15 21:46编辑过]

#26
ls_y0412022-11-16 13:42
#include "libxl.h"

int main()
{
    BookHandle book = xlCreateBook();
    if(book)
    {   
        FontHandle boldFont;
        FontHandle titleFont;
        FormatHandle titleFormat;
        FormatHandle headerFormat;
        FormatHandle descriptionFormat;
        FormatHandle amountFormat;
        FormatHandle totalLabelFormat;
        FormatHandle totalFormat;
        FormatHandle signatureFormat;
        SheetHandle sheet;
      
        boldFont = xlBookAddFont(book, NULL);
        xlFontSetBold(boldFont, 1);

        titleFont = xlBookAddFont(book, NULL);
        xlFontSetName(titleFont, L"Arial Black");
        xlFontSetSize(titleFont, 16);

        titleFormat = xlBookAddFormat(book, NULL);
        xlFormatSetFont(titleFormat, titleFont);

        headerFormat = xlBookAddFormat(book, NULL);
        xlFormatSetAlignH(headerFormat, ALIGNH_CENTER);
        xlFormatSetBorder(headerFormat, BORDERSTYLE_THIN);
        xlFormatSetFont(headerFormat, boldFont);        
        xlFormatSetFillPattern(headerFormat, FILLPATTERN_SOLID);
        xlFormatSetPatternForegroundColor(headerFormat, COLOR_TAN);

        descriptionFormat = xlBookAddFormat(book, NULL);
        xlFormatSetBorderLeft(descriptionFormat, BORDERSTYLE_THIN);

        amountFormat = xlBookAddFormat(book, NULL);
        xlFormatSetNumFormat(amountFormat, NUMFORMAT_CURRENCY_NEGBRA);
        xlFormatSetBorderLeft(amountFormat, BORDERSTYLE_THIN);
        xlFormatSetBorderRight(amountFormat, BORDERSTYLE_THIN);
               
        totalLabelFormat = xlBookAddFormat(book, NULL);
        xlFormatSetBorderTop(totalLabelFormat, BORDERSTYLE_THIN);
        xlFormatSetAlignH(totalLabelFormat, ALIGNH_RIGHT);
        xlFormatSetFont(totalLabelFormat, boldFont);

        totalFormat = xlBookAddFormat(book, NULL);
        xlFormatSetNumFormat(totalFormat, NUMFORMAT_CURRENCY_NEGBRA);
        xlFormatSetBorder(totalFormat, BORDERSTYLE_THIN);
        xlFormatSetFont(totalFormat, boldFont);
        xlFormatSetFillPattern(totalFormat, FILLPATTERN_SOLID);
        xlFormatSetPatternForegroundColor(totalFormat, COLOR_YELLOW);

        signatureFormat = xlBookAddFormat(book, NULL);
        xlFormatSetAlignH(signatureFormat, ALIGNH_CENTER);
        xlFormatSetBorderTop(signatureFormat, BORDERSTYLE_THIN);
            
        sheet = xlBookAddSheet(book, L"Invoice");
        if(sheet)
        {
            xlSheetWriteStr(sheet, 2, 1, L"Invoice No. 3568", titleFormat);

            xlSheetWriteStr(sheet, 4, 1, L"Name: John Smith", NULL);
            xlSheetWriteStr(sheet, 5, 1, L"Address: San Ramon, CA 94583 USA", NULL);

            xlSheetWriteStr(sheet, 7, 1, L"Description", headerFormat);
            xlSheetWriteStr(sheet, 7, 2, L"Amount", headerFormat);

            xlSheetWriteStr(sheet, 8, 1, L"Ball-Point Pens", descriptionFormat);
            xlSheetWriteNum(sheet, 8, 2, 85, amountFormat);
            xlSheetWriteStr(sheet, 9, 1, L"T-Shirts", descriptionFormat);
            xlSheetWriteNum(sheet, 9, 2, 150, amountFormat);
            xlSheetWriteStr(sheet, 10, 1, L"Tea cups", descriptionFormat);
            xlSheetWriteNum(sheet, 10, 2, 45, amountFormat);

            xlSheetWriteStr(sheet, 11, 1, L"Total:", totalLabelFormat);
            xlSheetWriteNum(sheet, 11, 2, 280, totalFormat);

            xlSheetWriteStr(sheet, 14, 2, L"Signature", signatureFormat);

            xlSheetSetCol(sheet, 1, 1, 40, NULL, 0);
            xlSheetSetCol(sheet, 2, 2, 15, NULL, 0);
        }

        xlBookSave(book, L"invoice.xls");      
        xlBookRelease(book);   
    }

    return 0;
}

#27
schtg2022-11-17 06:43
回复 25楼 ls_y041
我对此也是不太熟悉,仅从大师们那里学到一点点儿哈^_^

程序代码:
LoadLIBXL()

BOOK = xlCreateBookCA()
SHEET = xlBookAddSheetA(Book, [stu] ,0)
FOR III=1 TO 20
    xlSheetWriteStrA(SHEET, III, 1, [Test] , 0)
    xlSheetWriteNumA(SHEET, III, 2, III, 0)
    xlSheetWriteNumA(SHEET, III, 3, III+3, 0)
ENDFOR

*!*    设置单元格(3,2)格式,红色、加粗、17磅字体
lhFormat = xlBookAddFormatA(BOOK, 0)
lhFont = xlBookAddFontA(BOOK, 0)
xlFontSetNameA(lhFont, [微软雅黑])
xlFontSetColorA(lhFont, 10)
xlFontSetSizeA(lhFont, 17)
xlFontSetBoldA(lhFont, .t.)
xlFormatSetFontA(lhFormat, lhFont)
xlSheetSetCellFormatA(SHEET, 2, 1, lhFormat)

xlBookSaveA(Book, [Test.xls])
xlBookReleaseA(Book)

quit
*******

PROC LoadLIBXL

    DECLARE LONG    xlCreateBookCA                       in libxl.dll
    DECLARE INTEGER xlBookSaveA                          in libxl.dll LONG handle , STRING filename
    DECLARE LONG    xlBookAddSheetA                      in libxl.dll LONG handle , STRING name , LONG initSheet
    DECLARE LONG    xlBookAddFormatA                     in libxl.dll LONG handle , LONG initFormat
    DECLARE LONG    xlBookAddFontA                       in libxl.dll LONG handle , LONG initFont                                               
    DECLARE         xlBookReleaseA                       in libxl.dll LONG handle
    DECLARE         xlSheetSetCellFormatA                in libxl.dll LONG handle , INTEGER row , INTEGER col , LONG format
    DECLARE INTEGER xlSheetWriteStrA                     in libxl.dll LONG handle , INTEGER row , INTEGER col , STRING value , LONG format
    DECLARE INTEGER xlSheetWriteNumA                     in libxl.dll LONG handle , INTEGER row , INTEGER col , DOUBLE value , LONG format
    DECLARE         xlFontSetSizeA                       in libxl.dll LONG handle , INTEGER size
    DECLARE         xlFontSetColorA                      in libxl.dll LONG handle , INTEGER color
    DECLARE         xlFontSetBoldA                       in libxl.dll LONG handle , INTEGER bold
    DECLARE         xlFontSetNameA                       in libxl.dll LONG handle , STRING name
    DECLARE INTEGER xlFormatSetFontA                     in libxl.dll LONG handle , LONG fontHandle


[此贴子已经被作者于2022-11-17 06:45编辑过]

#28
ls_y0412022-11-17 17:17
太感谢了, 这个真的很好用,谢谢。这个可以应用到BS的程序中,来实现做报表的事。我要好好学习一下。
#29
ls_y0412022-11-18 09:25
关于libxl的想引用模板文件做好了的工作表带有格式,这样直接把数据写入到工作表中就方便了,有这样的示例代码!!!!

[此贴子已经被作者于2022-11-18 13:27编辑过]

1