可变参数导出EXCElL

 

 

//.H文件

#include <stdarg.h>
extern void  StringGridToExcelMutiSheet(String CentStr,int Strgridcount,...);//多个页面,可变参数
void  StringGridToExcelMutiSheet(String CentStr,int Strgridcount,...)
{
    Variant   my_excel,all_workbooks,my_workbook,my_worksheet,Range;
    try
    {
        my_excel=CreateOleObject("excel.Application");//启动Excel
    }
    catch(...)
    {
        MessageBox(GetFocus(),"无法启动Excel","警告",MB_OK|MB_ICONSTOP);
        //异常中断
        Abort();
    }

    my_excel.OlePropertySet("Visible",(Variant)true);   //使Excel启动后可见
    all_workbooks=my_excel.OlePropertyGet("WorkBooks");
    Procedure   Open("Open");
    va_list ap;//声明一个va_list变量
    va_start(ap,Strgridcount);//初始化,第二个参数为最后一个确定的形参
    my_workbook=all_workbooks.OleFunction("Add");//新建一个工作薄     //单工作表
    my_workbook=my_excel.OlePropertyGet("ActiveWorkbook");
    for(int i = 0; i < Strgridcount; i++)
    {
           TStringGrid*StringGridHisData=va_arg(ap, TStringGrid*); //读取可变参数,的二个参数为可变参数的类型
           TStringGridInfo*StringGridHisDataFault_Point=(TStringGridInfo*)StringGridHisData->Tag;

           Variant bef1,aft1;
           int count=my_excel.OlePropertyGet("sheets").OlePropertyGet("count");
           if (i>=3)//默认创建三个,超过三个需要创建
           {
               aft1=my_excel.OlePropertyGet("sheets",count);
               my_workbook.OlePropertyGet("sheets").OleProcedure("Add",bef1.NoParam(),aft1);
           }


        //   my_worksheet=my_workbook.OlePropertyGet("Sheets");
         //  my_worksheet = my_workbook.OleProcedure("Add");

         //  my_worksheet=my_workbook.OlePropertyGet("Sheets", i+1);

           my_excel.OlePropertyGet("Sheets",i+1).OleProcedure("Select");//选择第二工作表
           my_worksheet=my_excel.OlePropertyGet("ActiveSheet");//选择第二工作表?
         //  String SheetName="数据表"+IntToStr(i+1);
           String SheetName=AnsiString(StringGridHisDataFault_Point->SheetName);
           my_worksheet.OlePropertySet("Name",SheetName.c_str());//重命名当前工作表   strTitle.c_str()   CentStr.Trim().c_str()
           char cellsstart = 0x41;
           String strRanger = cellsstart;
           strRanger+="1:";
           cellsstart += StringGridHisData->ColCount-1;
           String tmpstr = cellsstart;
           strRanger += tmpstr+"1";
           Range=my_excel.OlePropertyGet("Cells",1,1);
           my_excel.OlePropertyGet("Range",strRanger.c_str()).OleFunction("Merge", false);//将指定的单元格合并
           my_excel.OlePropertyGet("Cells",1,1).OlePropertySet("Value",CentStr.Trim().c_str());
           my_excel.OlePropertyGet("Cells",1,1).OlePropertySet("HorizontalAlignment",xlCenter);// 居中
           my_excel.OlePropertyGet("Rows", 1).OlePropertySet("RowHeight", 40);

           Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("size",25);
           Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("Name","宋体");
           Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("bold",true);



           Range=my_excel.OlePropertyGet("Range",strRanger.c_str());
           Range.OlePropertyGet("Borders",1).OlePropertySet("LineStyle",-4142);  //左框
           Range.OlePropertyGet("Borders",2).OlePropertySet("LineStyle",-4142);  //下框
           Range.OlePropertyGet("Borders",3).OlePropertySet("LineStyle",-4142);  //上框
           Range.OlePropertyGet("Borders",4).OlePropertySet("LineStyle",-4142);  //下框
           Range.OlePropertyGet("Borders").OlePropertySet("Weight",2);



           Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("size",15);
           Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("Name","宋体");
           Range.OlePropertyGet("Cells").OlePropertyGet("Font").OlePropertySet("bold",true);

           //设置列宽
           Range=my_excel.OlePropertyGet("Cells",1);
           Range.OlePropertySet("ColumnWidth",12);// 行宽

           Range=my_excel.OlePropertyGet("Cells",2);
           Range.OlePropertySet("ColumnWidth",20);// 行宽

           Range=my_excel.OlePropertyGet("Cells",3);
           Range.OlePropertySet("ColumnWidth",20);// 行宽

           Range=my_excel.OlePropertyGet("Cells",4);
           Range.OlePropertySet("ColumnWidth",20);// 行宽

           Range=my_excel.OlePropertyGet("Cells",5);
           Range.OlePropertySet("ColumnWidth",20);// 行宽

           //输出表体
           for(int i=0;i<StringGridHisData->ColCount;i++)
           {

               Range=my_excel.OlePropertyGet("Cells",i+1);
               Range.OlePropertySet("HorizontalAlignment",xlCenter);// 居中

               for(int k=0;k<StringGridHisData->RowCount;k++)
               {

                   my_excel.OlePropertyGet("Rows", k+1).OlePropertySet("RowHeight", 25);
                   Range= my_excel.OlePropertyGet("Cells",(k+2),(i+1));
                   Range.OlePropertySet("NumberFormatLocal", "@");
                   Range.OlePropertySet("Value",StringGridHisData->Cells[i][k].Trim().c_str());

                   Range.OlePropertyGet("Borders",1).OlePropertySet("LineStyle",-4142);  //左框
                   Range.OlePropertyGet("Borders",2).OlePropertySet("LineStyle",-4142);  //下框
                   Range.OlePropertyGet("Borders",3).OlePropertySet("LineStyle",-4142);  //上框
                   Range.OlePropertyGet("Borders",4).OlePropertySet("LineStyle",-4142);  //下框
                   Range.OlePropertyGet("Borders").OlePropertySet("Weight",2);
                   Range.OlePropertySet("WrapText", true);
                   Application->ProcessMessages();
               }

           }
    }
    va_end(ap);//清理工作
}

 

<think>好的,我现在需要解决用户的问题:SAP导出Excel时标题发生变化的解决方案。首先,我需要理解用户的具体情况。用户可能在导出数据时,比如使用SAP的报表或者事务码导出Excel,发现标题(字段名称)与实际预期不符,比如变成了字段代码、技术名称,或者语言不一致等问题。 接下来,我应该回忆或查找相关的SAP配置和操作步骤。根据用户提供的引用内容,特别是引用[3]提到的ME1M报表布局调整和导出Excel的需求,这可能涉及到SAP报表的布局设置。通常,SAP允许用户自定义布局,包括字段的选择和标题的修改。 首先想到的是检查用户使用的报表或事务码是否支持自定义布局。例如,在ALV报表中,用户通常可以调整布局,修改字段的标题文本。引用[3]中提到调整Layout,可能需要用户在导出前调整字段的标题,确保其正确显示。 其次,可能需要检查语言设置。如果SAP系统语言和导出Excel时的语言不一致,可能导致标题翻译不正确。例如,用户系统是英文,但导出时需要中文标题,可能需要调整语言参数或者在布局中明确设置标题文字。 另外,引用[2]提到使用Excel处理数据,可能涉及导出后的调整,但用户的问题是在导出时标题就变化,所以应优先解决SAP端的配置,而不是导出后的处理。 另外,考虑SAP的标准导出功能可能存在默认设置,比如使用字段名称而非描述。例如,某些事务码导出Excel时可能默认使用技术字段名,而不是用户友好的标题。此时需要找到相关设置,切换为显示文本而非技术名称。 可能的解决方案步骤包括: 1. 在导出前调整报表布局,修改字段标题。 2. 检查并设置正确的语言参数。 3. 使用用户出口或增强功能自定义导出逻辑。 4. 使用第三方工具或脚本处理导出文件,但用户可能更希望直接在SAP中解决。 需要确认这些步骤是否可行,并参考用户提供的引用内容。例如,引用[3]提到调整报表布局以满足导出需求,说明调整布局是可行的。同时,引用[4]中提到迁移数据时需注意字段对应,可能涉及到字段映射的问题,这也与标题是否正确相关。 另外,如果用户没有开发权限,可能需要使用标准配置,而无法进行增强开发。因此,优先推荐布局调整和语言设置的方法。 现在需要将这些思路整理成结构化的解决方案,分步骤说明,并确保引用相关的参考内容。同时,生成相关问题,可能涉及布局调整、语言设置、增强功能等。</think>### SAP导出Excel标题变更解决方案 #### 1. 调整报表布局字段标题 在SAP的ALV报表导出功能中,可通过自定义布局直接修改字段显示文本: - **步骤**:执行报表后,点击布局调整按钮(如“变更布局”),进入字段选择界面,双击字段并修改“标题”属性为需要的文本,保存布局[^3]。 - **示例**:ME1M报表导出时,将`MATNR`字段标题改为“物料编号”。 #### 2. 设置导出语言参数 若标题因语言环境显示错误,可通过以下方式解决: - **方法**:在用户参数设置中添加`LAN`参数,指定语言代码(如ZH中文),或导出时临时切换系统语言[^4]。 - **验证**:事务码`SU3`检查用户参数,确保`LANGU`字段值为所需语言。 #### 3. 使用增强开发修正标题 若标准功能无法满足,可通过用户出口或BADI增强: - **技术方案**:使用`ALV的BADI`(如`REUSE_ALV_GRID_DISPLAY`)在输出前动态修改字段描述。 - **示例代码**: ```abap LOOP AT lt_fieldcat ASSIGNING <fs_fieldcat>. CASE <fs_fieldcat>-fieldname. WHEN 'MATNR'. <fs_fieldcat>-seltext_m = '物料编码'. ENDCASE. ENDLOOP. ``` #### 4. 导出后使用Excel公式处理(临时方案) 若无法修改SAP配置,可导出后批量替换标题: - **步骤**:导出原始数据,在Excel中使用`查找替换`或`VLOOKUP`将技术字段名映射为业务名称[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值