Como criar relatório com duas lista de objetos


Imagem gerada de uma impressão de uma planilha.

Tenho que criar um relatório em PDF igual a esse.
Como criar relatório a partir de um lista objetos ou direto do banco eu já sei.
Porem como visto na imagem tem vários campos e cada um esta em uma tabela eu pensei em criar uma lista de objeto e colocar todos os dados no objeto e mandar gerar o PDF porem nessa lista fica duplicando os dados: codigo,nome,clas,turno e somente muda os da operação que eh cod descricao e T.P.U eu pensei em gerar um lista de operação dentro da lista do objeto.
A imagem acima mostra somente de um colaborador e nessa lista poderá ter mais colaboradores e eu quero que gere somente um PDF com varias lista igual a da imagem

Olha, eu prefiro a seguinte abordagem: Criar uma classe que contemple todos os valores a serem apresentados no relatório e, então, gerar o relatório a partir de uma lista deste objeto.
O relatório não serve como parte do processamento, ele deve ser o produto final.

ok @darlan_machado e o que eu estava pensando porem sobre os atributos desse objeto para não duplicar teria que ter uma lista de operações dentro do objeto. exemplo

Objeto apontamento
codigo = *
nome=*
clas=*
turno=* ate aqui já deu certo e eu já fiz estou travado nas operacões

lista = cod = *
descricao=*
T.P.U=*

seria asim? como acessar esta lista depois gerando o pdf

Cara, não complica.
Primeiro, você disse isso:

Certo? Dados que não se repetem.
E

Que se referem a operação, não é isso?

A impressão será nos moldes do apresentado na imagem?
Eu não sei o que está usando para desenvolver o relatório, mas, eu usaria jasperreports e criaria um objeto conforme você mesmo comentou: os dados de cada colaborador e uma lista com as operações.

Então, faria um relatório preenchendo a banda details com os dados de cada colaborador e um sub report com os dados da operação.

Certo.

também esta certo.

sim como o da imagem.

estou usando ele mesmo

Justamente aqui que estou com dificuldade! eu criaria um objeto com

e uma lista de operações separada do objeto como passaria ela para o jasperreports?
geralmente eu passo em forma de 1 lista só seria ou a do objeto ou da operação não teria que juntar para mandar.

JasperPrint print = JasperFillManager.fillReport(report, null, new JRBeanCollectionDataSource(lista));

Então eu já tentei criar dessa forma mais cedo e ate estou com ela ainda porem não consigo justamente colocar o da operação no sub_relatorio por causa da lista

Mostre o código que fez, cara.

certo qual deles o do jasper ou o que gera a lista de objeto?

O da lista.
Sobre o jasper, tem algum erro? Log?

nao.

ele esta gerando normal a parte sem ser o do sub relatório.
possa ser também na criação dele…
posso postar amanha cedo pois tenho que sair somente amanha poderei voltar a mexer obrigado pela atenção e amanha eu posto código cedo e lhe aguardo

LinkedList<Vin_Colaborador> listavin = new LinkedList<Vin_Colaborador>();
        LinkedList<Vin_Funcao_Operacao> listafuncao = new LinkedList<Vin_Funcao_Operacao>();
        LinkedList<Vin_Funcao_Operacao> listafu = new LinkedList<Vin_Funcao_Operacao>();
        LinkedList<Operacao> listaop = new LinkedList<Operacao>();
        BigDecimal cola = null;
        for (int i = 0; i < lista.size(); i++) {
            Vin_Colaborador c = lista.get(i);
            String codapo = String.valueOf(tabelaColaborador.getValueAt(i, 0));
            if (codapo.equals("true")) {
                listavin.add(c);
            }
        }
        if (listavin.size() == 0) {
            JOptionPane.showMessageDialog(null, "Voce nao escolheu nenhum colaborador");
        } else {
            if (txt_Data_Final.getText().isEmpty()) {
                JOptionPane.showMessageDialog(null, "Campo de data final vazio");
            } else if (txt_Data_Inicial.getText().isEmpty()) {
                JOptionPane.showMessageDialog(null, "Campo de data inicial vazio");
            } else {
                try {
                    LocalDate dataInicial = LocalDate.parse(txt_Data_Inicial.getText(), DateTimeFormatter.ofPattern("dd/MM/yyyy"));
                    LocalDate dataFinal = LocalDate.parse(txt_Data_Final.getText(), DateTimeFormatter.ofPattern("dd/MM/yyyy"));
                    Vin_Colaborador c = null;
                    for (int i = 0; i < listavin.size(); i++) {
                        c = listavin.get(i);
                        ColaboradorDao colaboradorDao = new ColaboradorDao();
                        Colaborador co = colaboradorDao.busca(c.getID_colaborador());
                        Clas_FuncaoDao clas_FuncaoDao = new Clas_FuncaoDao();
                        Clas_Funcao cf = clas_FuncaoDao.busca(co.getID_clas_funcao());
                        Vin_Funcao_OperacaoDao vin_Funcao_OperacaoDao = new Vin_Funcao_OperacaoDao();
                        listafuncao = vin_Funcao_OperacaoDao.buscaPorFuncao(cf.getID_Clas_Funcao());

                        for (int j = 0; j < listafuncao.size(); j++) {
                            Vin_Funcao_Operacao vfo = listafuncao.get(j);
                            vfo.setCodigo(co.getCodigo());
                            vfo.setNome_colaborador(co.getNome());
                            vfo.setNome_funcao(cf.getDescricao());
                            TurnoDao turnoDao = new TurnoDao();
                            Turno t = turnoDao.busca(co.getID_turno());
                            vfo.setTurno(t.getDescricao());
                            OperacaoDao operacaoDao = new OperacaoDao();
                            Operacao op = operacaoDao.busca(vfo.getID_operacao());
                            vfo.setDescricao_operacao(op.getDescricao());
                            vfo.setCodigo_operacao(op.getCodigo_operacao());
                            double total = op.getTempo_padrao();
                            total = total / 60;
                            int hr = (int) total;
                            double minf = total - hr;
                            minf = minf * 60;
                            double aux1 = (Math.round(minf));
                            int min = (int) aux1;
                            double seg = minf - min;
                            seg = seg * 60;
                            double aux2 = (Math.round(seg));
                            int segint = (int) aux2;
                            String se = Integer.toString(segint);
                            String mi = Integer.toString(min);
                            String h = Integer.toString(hr);
                            if (se.length() == 1) {
                                se = "0" + se;
                            }
                            if (mi.length() == 1) {
                                mi = "0" + mi;
                            }
                            if (h.length() == 1) {
                                h = "0" + h;
                            }
                            String tempo = h + ":" + mi + ":" + se;
                            vfo.setTempo_padrao(tempo);

                            System.out.println(vfo.getCodigo());
                            System.out.println(vfo.getDescricao_operacao());
                            System.out.println(vfo.getID_Vin_Funcao_Operacao());
                            System.out.println(vfo.getID_clas_funcao());
                            System.out.println(vfo.getID_operacao());
                            System.out.println(vfo.getCodigo_operacao());
                            System.out.println(vfo.getNome_colaborador());
                            System.out.println(vfo.getNome_funcao());
                            System.out.println(vfo.getTempo_padrao());
                            System.out.println(j);

                            if (cola != null) {
                                if (co.getID_colaborador() == cola) {
                                    System.out.println("Mesmo colaborador");
                                    listaop.add(op);
                                    vfo.setLista(listaop);
                                } else {
                                    System.out.println("aaaa");
                                    listafu.add(vfo);
                                }
                            }

                            cola = co.getID_colaborador();
                            System.out.println("--------------------");

                        }
                        cola = co.getID_colaborador();

                    }
                    //this.dispose();
                } catch (Exception e) {
                    JOptionPane.showMessageDialog(null, "Valor de data digitados errados Erro:\n" + e);
                }
                try {
                    RelatorioColaborador_Branco relatorio = new RelatorioColaborador_Branco();
                    relatorio.imprimir(listafu);
                } catch (Exception ex) {
                    Logger.getLogger(Frame_Operacao.class.getName()).log(Level.SEVERE, null, ex);
                    System.out.println(ex.getMessage());
                }

            }

        }