c++ excel库 xlnt使用心得

github地址:https://github.com/tfussell/xlnt

编译步骤:

  • mkdir build

  • cd build

  • cmake ..

  • make

souce目录下有动态库

代码栗子

#include 
#include 
#include 

int main()
{
    xlnt::workbook wb;
    xlnt::worksheet ws = wb.active_sheet();

    ws.cell("A1").value(5);
    ws.cell("B2").value("string data");
    xlnt::font font;

    xlnt::font run_font;
            run_font.color(xlnt::color::blue());
            run_font.name("SimSun");
//            run_font.scheme("ascheme");
            run_font.size(13);




    ws.cell(1,7).font(run_font);
    xlnt::border border;

    xlnt::border::border_property border_pro;
    border_pro.style(xlnt::border_style::thin);

    border.side(xlnt::border_side::start,border_pro);
    border.side(xlnt::border_side::end,border_pro);
    border.side(xlnt::border_side::top,border_pro);
    border.side(xlnt::border_side::bottom,border_pro);
//            cell.border(border);

    ws.cell(2,7).border(border);
    xlnt::alignment alignment;
    alignment.horizontal(xlnt::horizontal_alignment::center);

    ws.cell(1,7).alignment(alignment);

    ws.cell(1,7).value("宋体");

    run_font.color(xlnt::color::red());
    ws.cell(1,9).font(run_font);

    ws.cell(1,9).number_format(xlnt::number_format::number_comma_separated1());
    ws.cell(1,9).value(11111111.11);
    ws.cell("B2").comment("中文测试a:10000.0=中文啊啊:100000222","勾稽");
     ws.cell("B5").value("xxxx");
    ws.cell("B5").comment("中文测试a:10000.0=中文啊啊:100000222","勾稽");
    xlnt::comment com1("aaaaaaaaaaaaaaaaaaaaaaaaaa\naaaaaaaaa","xxx");
    com1.size(800,800);
std::cout<.height()<<std::endl;
    ws.cell(2,9).comment(com1);
    ws.cell(2,9).value("test ");
    ws.cell("C3").formula("=RAND()");

    ws.merge_cells("C3:C4");
//    ws.freeze_panes("B2");

    wb.save("中文1.xlsx");


    char merge_range[256];
    int start=65;
//        char start_c=start;
    int end=start+10-1;
    std::sprintf(merge_range,"%c1:%c1",start,end);
    std::string ss=merge_range;

    std::cout << ss<<std::endl;

    return 0;
}

问题

comment的size方法不起作用

  • 查看源码 发现 cell.cpp中comment()方法中把comment的size重新初始化为200*100,需要自己判断comment的size是否为0,为0才需要初始化。

  • 这时重新编译源码,调用后发现虽然size成功设置了,但excel打开comment大小还是没改变。

  • 通过vim 打开excel ,发现excel由几个xml组成,找到vmlDrawing1.vml并打开。你会找到你之前设置的comment的大小如:width:800pt;height:800pt ,那说明excel中确实设置了,只不过并没有起作用。

  • 这时我在Windows上自己新建了一个excel,然后手动调整了批注框的大小,然后通过vim 打开该excel,将里面的所有xml与之前程序生成的excel的xml进行对比,总结出的结论是comment的大小与vmlDrawing1.vml下的标签“x:Anchor”中的后四位数字有关,具体关系还需要进一步验证

  • 另一种解决方案:修改comment大小主要是为了让comment中的内容显示完整,那么window的excel软件中对批注框有个设置“自适应文本大小”,对应的xml就是在vmlDrawing1.vml的标签v:textbox中增加mso-fit-shape-to-text:t,即:”style=”mso-direction-alt:auto;auto;mso-fit-shape-to-text:t”。不知过这个在linux的excel软件中不起作用。源码修改就是xlsx_producer.cpp中“write_attribute(“style”, “mso-direction-alt:auto”);”修改为“write_attribute(“style”, “mso-direction-alt:auto;auto;mso-fit-shape-to-text:t”);”即默认自适应

    -如果linux平台打开excel,那还是需要弄懂 x:Anchor里面的内容

你可能感兴趣的:(c++,excel,xlnt)