标题:关于libxl 读取excel 的vfp的方法
只看楼主
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
测试结果:10W条记录,每条记录50个字段,导出xlsx,18M,用时59秒
使用方法:xlSheetWriteNumA和xlSheetWriteStrA,逐个字段写入的,不知有没有批量写入的方法,比如数组复制(在函数列表中未发现)
问题:
1.有部分字段内容未写入(第一条8个字段,最后一条11个字段,其他未检查)
2.中间散落8处字段内容被改写为:Buy me !,猜想是因为没有key

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

2022-04-06 09:04
easyppt
Rank: 3Rank: 3
等 级:论坛游侠
威 望:1
帖 子:119
专家分:169
注 册:2021-11-24
得分:0 
这个专题好,因为现在很多用户都是用WPS,他们不愿意安装 OFFICE EXCEL
laowan001 斑竹 能分享一下代码吗

希望斑竹们整理成出更多的例子,谢谢!  
2022-04-06 10:57
laowan001
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:54
帖 子:802
专家分:1914
注 册:2015-12-30
得分:0 
以下是引用easyppt在2022-4-6 10:57:04的发言:

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

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

我用的是2楼的代码,自己找了个数据源(记录数自己定),循环所有记录,写入每个单元格的内容即可
2022-04-06 15:35
厨师王德榜
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:183
帖 子:942
专家分:4724
注 册:2013-2-16
得分:0 
这个库只能一个格子一个格子的读取吗?
如果已知起始行,起始列,可以一次性读取到数组/或json结构中吗?
如果只能一格一格的读取,那效率有点低啊.
2022-04-11 12:13
ls_y041
Rank: 2
等 级:论坛游民
威 望:1
帖 子:157
专家分:35
注 册:2005-9-29
得分:0 
回复 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编辑过]

2022-11-15 21:31
ls_y041
Rank: 2
等 级:论坛游民
威 望:1
帖 子:157
专家分:35
注 册:2005-9-29
得分:0 
#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;
}

2022-11-16 13:42
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
回复 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编辑过]

2022-11-17 06:43
ls_y041
Rank: 2
等 级:论坛游民
威 望:1
帖 子:157
专家分:35
注 册:2005-9-29
得分:0 
太感谢了, 这个真的很好用,谢谢。这个可以应用到BS的程序中,来实现做报表的事。我要好好学习一下。
2022-11-17 17:17
ls_y041
Rank: 2
等 级:论坛游民
威 望:1
帖 子:157
专家分:35
注 册:2005-9-29
得分:0 
关于libxl的想引用模板文件做好了的工作表带有格式,这样直接把数据写入到工作表中就方便了,有这样的示例代码!!!!

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

2022-11-18 09:25



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-508670-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.063085 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved