c++ excel庫 xlnt使用心得

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

編譯步驟:

  • mkdir build

  • cd build

  • cmake ..

  • make

souce目錄下有動態庫

代碼栗子

#include <xlnt/xlnt.hpp>
#include <iostream>
#include <string.h>

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<<com1.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裏面的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章