虚表 —— 保存为csv格式文件或获取csv格式文本

光庆 6月前 936

import win.ui;
import godking.vlistEx;
/*DSG{{*/
mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
mainForm.add(
button={cls="button";text="保存为csv文件";left=160;top=496;right=400;bottom=544;z=2};
button2={cls="button";text="导入csv文件";left=424;top=496;right=664;bottom=544;z=3};
checkbox={cls="checkbox";text="UTF8";left=160;top=472;right=264;bottom=496;z=4};
vlist={cls="vlistEx";left=10;top=10;right=840;bottom=440;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
)
/*}}*/

var t = { fields={"序号","姓名","身份证"} };
for(i=1;10;1){
    var tt={};
    tt["序号"]="[@rowindex]";
    tt["姓名"]=`"{ 姓 +@# '+-/* $ !%$[']名 }"`;
    tt["身份证"]="//!@##$%%$^&^&**())_身'份'证\\";
    ..table.push(t,tt);
}
mainForm.vlist.setTable(t,,{50,300,300},0x1);

mainForm.button.oncommand = function(id,event){
    mainForm.vlist.saveToCsv("C:\Users\Administrator\Desktop\a.csv",true,mainForm.checkbox.checked) //保存为csv格式文件
}

mainForm.button2.oncommand = function(id,event){
	mainForm.vlist.openCsv("C:\Users\Administrator\Desktop\a.csv",true/*包含表头*/,true/*重建列*/)
}

mainForm.show();
win.loopMessage();


最新回复 (9)
  • mndsoft 3月前
    0 引用 2

    卢大师,这个保存为 csv 文件为何乱码? 

    另外,请指导下如何把 保存的csv文件加载到 虚表,谢谢


  • mndsoft 3月前
    0 引用 3

    乱码可能是导出时编码格式所致,用记事本或notepad++打开显示正常。

    另外,让Claude 3.5 Sonnet写了导入的功能,不过用的是aardio内置的listview。接下来试试让Claude 3.5 Sonnet 学习下 卢大师的虚表。

    import win.ui;
    import fsys.dlg;
    
    /*DSG{{*/
    var winform = win.form(text="CSV 文件读取与导出示例";right=759;bottom=469)
    winform.add(
        btnLoad={cls="button";text="加载 CSV 文件";left=10;top=10;right=120;bottom=40;z=1};
        btnExport={cls="button";text="导出 CSV 文件";left=130;top=10;right=240;bottom=40;z=3};
        listview={cls="listview";left=10;top=50;right=750;bottom=460;edge=1;fullRow=1;gridLines=1;z=2}
    )
    /*}}*/
    
    // 简单的 CSV 解析函数
    function parseCsv(str) {
        var lines = string.split(str, '\n');
        var result = {};
        for(i=1; #lines; 1) {
            var line = string.trim(lines[i]);
            if(#line > 0) {
                var fields = string.split(line, ',');
                for(j=1; #fields; 1) {
                    fields[j] = string.trim(fields[j]);
                }
                table.push(result, fields);
            }
        }
        return result;
    }
    
    // CSV 导出函数
    function exportToCsv(data) {
        var lines = {};
        for(i=1; #data; 1) {
            var line = {};
            for(j=1; #data[i]; 1) {
                // 如果字段包含逗号、引号或换行符,将其用引号括起来
                if(string.find(data[i][j], '[,"\r\n]')) {
                    table.push(line, '"' + string.replace(data[i][j], '"', '""') + '"');
                } else {
                    table.push(line, data[i][j]);
                }
            }
            table.push(lines, string.join(line, ','));
        }
        return string.join(lines, '\r\n');
    }
    
    // 加载 CSV 文件
    winform.btnLoad.oncommand = function(id,event){
        var filepath = fsys.dlg.open("CSV 文件|*.csv|所有文件|*.*||", "选择 CSV 文件");
        if(!filepath) return;
        
        var content = string.load(filepath);
        if(!content) {
            win.msgbox("无法读取文件内容", "错误");
            return;
        }
        
        var csv = parseCsv(content);
        if(#csv < 1) {
            win.msgbox("CSV 文件为空或格式不正确", "错误");
            return;
        }
        
        winform.listview.clear();
        //winform.listview.clearColumn();
        
        for(i=1; #csv[1]; 1){
            winform.listview.insertColumn(csv[1][i], 100);
        }
        
        for(i=2; #csv; 1){
            winform.listview.addItem(csv[i]);
        }
        
       // for(i=1; #csv[1]; 1){
       //     winform.listview.setColumnWidth(i, -2);
       // }
    }
    
    // 导出 CSV 文件
    winform.btnExport.oncommand = function(id,event){
        var data = {};
        
        // 获取列标题
        var columns = {};
        var columnCount = winform.listview.columnCount;
        if(columnCount == 0) {
            win.msgbox("listview 中没有数据可以导出", "错误");
            return;
        }
        
        for(i=1; columnCount; 1) {
            var columnInfo = winform.listview.getColumn(i);
            if(columnInfo) {
                table.push(columns, columnInfo.text);
            }
        }
        table.push(data, columns);
        
        // 获取所有行数据
        var itemCount = winform.listview.count;
        for(i=1; itemCount; 1) {
            var row = {};
            for(j=1; columnCount; 1) {
                table.push(row, winform.listview.getItemText(i, j));
            }
            table.push(data, row);
        }
        
        // 导出为 CSV
        var csvContent = exportToCsv(data);
        
        // 保存文件
        var filepath = fsys.dlg.save("CSV 文件|*.csv|所有文件|*.*||", "保存 CSV 文件", "*.csv");
        if(filepath) {
            string.save(filepath, csvContent);
            win.msgbox("文件已成功导出", "成功");
        }
    }
    
    winform.show();
    win.loopMessage();


  • 光庆 3月前
    0 引用 4
    mndsoft 卢大师,这个保存为 csv 文件为何乱码?&nbsp;另外,请指导下如何把 保存的csv文件加载到 虚表,谢谢
    已升级版本,可以设置保存时是否为UTF8编码。
  • mndsoft 3月前
    0 引用 5

    感谢,已升级解决。请问大师,虚表中保存为csv文件,能否把选择框的值也保存到 csv文件中,这样下次加载就方便了。

    选择框使用的 "<img name='DefaultUncheckedImg'"

  • mndsoft 3月前
    0 引用 6

    大师,另外再请教下: 1、当使用 insertRow() 插入一行,如何让需要重新自动唯一排序? 2、双击编辑单元格,如何能否选中文本?谢谢


  • 光庆 3月前
    0 引用 7
    mndsoft 大师,另外再请教下: 1、当使用&nbsp;insertRow() 插入一行,如何让需要重新自动唯一排序? 2、双击编辑单元格,如何能否选中文本?谢谢
    import win.ui;
    import godking.vlistEx;
    /*DSG{{*/
    mainForm = win.form(text="vlistEx - table adapter";right=849;bottom=578)
    mainForm.add(
    button={cls="button";text="Button";left=320;top=464;right=520;bottom=544;z=2};
    vlist={cls="vlistEx";left=10;top=10;right=840;bottom=440;db=1;dl=1;dr=1;dt=1;edge=1;transparent=1;z=1}
    )
    /*}}*/
    
    mainForm.show();
    var t = { fields={"序号","姓名","年龄","地址","身份证"} };
    for(i=1;10000;1){
        var tt={};
        tt["序号"]="[@rowindex]";  // 行序号标记是不允许编辑修改的
        tt["姓名"]="["+string.random(math.random(1,10))+"]";
        tt["年龄"]="["+string.random(math.random(1,20))+"]";
        tt["地址"]="["+string.random(math.random(1,30))+"]";
        tt["身份证"]="["+string.random(math.random(1,40))+"]";
        ..table.push(t,tt);
    }
    mainForm.button.oncommand = function(id,event){
    	mainForm.vlist.insertRow(5,{
        	["序号"]="[@rowindex]";  // 行序号标记是不允许编辑修改的
        	["姓名"]="5555";
        	["年龄"]="5555";
        	["地址"]="5555";
        	["身份证"]="5555";
    	})
    }
    mainForm.vlist.setTable(t);
    mainForm.vlist.setColWidthFit();
    win.loopMessage();


  • 光庆 3月前
    0 引用 8
    mndsoft 大师,另外再请教下: 1、当使用&nbsp;insertRow() 插入一行,如何让需要重新自动唯一排序? 2、双击编辑单元格,如何能否选中文本?谢谢
    参考:https://aardio.online/thread-396.htm
  • 光庆 3月前
    0 引用 9

    像你这种索引不是自动生成的,要转为自动的话,或者要重新设置某列为自动索引的话,可以用 mainForm.vlist.setRowIndex(1) 设置。

  • mndsoft 3月前
    0 引用 10
    光庆 像你这种索引不是自动生成的,要转为自动的话,或者要重新设置某列为自动索引的话,可以用 mainForm.vlist.setRowIndex(1) 设置。
    谢谢,序号是以 [@rowindex] 作为索引的,我是saveToCsv导出csv文件,openCsv加载后,这时候insertRow数据就不会自动排序了。 另外 选择框的值能否保存到 csv文件中,这样下次可以存储上次勾选的的状态,现在是把选择框状态存在文件里,openCsv后再次加载一下,有点麻烦哈
返回