Imprimir apenas o selecionado na Jtable e enviar para o BD

Bom dia pessoal!

To com esses dois problemas já tem um tempo, abaixo postarei a imagem que serve para entender os dois problemas:

Primeiro problema é ao selecionar todas essas linhas e clicar no botão (+adicionar), ela adiciona só a primeira linha no banco de dados, e não todas informações como eu preciso. Segue o código que hoje só faz uma adição:

private void adicionar() {

    String sql = "insert into tblgem(lista,dat,pep,listec,item,material,txtbre,qtde,um,rncrm,necob,natnf,local,pepaux,projeto) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
    try {
        pst = conexao.prepareStatement(sql);
                    
        pst.setString(1, jTable1.getValueAt(jTable1.getSelectedRow(), 0 ).toString());
        pst.setString(2, jTable1.getValueAt(jTable1.getSelectedRow(), 1).toString());
        pst.setString(3, jTable1.getValueAt(jTable1.getSelectedRow(), 2).toString());
        pst.setString(4, jTable1.getValueAt(jTable1.getSelectedRow(), 3).toString());
        pst.setString(5, jTable1.getValueAt(jTable1.getSelectedRow(), 4).toString());
        pst.setString(6, jTable1.getValueAt(jTable1.getSelectedRow(), 5).toString());
        pst.setString(7, jTable1.getValueAt(jTable1.getSelectedRow(), 6).toString());
        pst.setString(8, jTable1.getValueAt(jTable1.getSelectedRow(), 7).toString());
        pst.setString(9, jTable1.getValueAt(jTable1.getSelectedRow(), 8).toString());
        pst.setString(10, jTable1.getValueAt(jTable1.getSelectedRow(), 9).toString());
        pst.setString(11, jTable1.getValueAt(jTable1.getSelectedRow(), 10).toString());
        pst.setString(12, jTable1.getValueAt(jTable1.getSelectedRow(), 11).toString());
        pst.setString(13, jTable1.getValueAt(jTable1.getSelectedRow(), 12).toString());
        pst.setString(14, jTable1.getValueAt(jTable1.getSelectedRow(), 13).toString());
        pst.setString(15, jTable1.getValueAt(jTable1.getSelectedRow(), 14).toString());
        

        int adicionado = pst.executeUpdate();
        
        
                                         
        if (adicionado > 0 ) {
            JOptionPane.showMessageDialog(null, "Requisições adicionadas com sucesso!");
        }

    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    }

E o segundo problema ta na parte de impressão, o meu ideal seria eu imprimir também só o que for selecionado na tabela, porém quando chamo a impressão(Configurei pra utilizar iReport) ele chama todo o banco de dados, fazendo assim ter uma perca gradual de tempo. Segue o código que hoje faz isso:

// gerando impressão
int confirma = JOptionPane.showConfirmDialog(null, “Confirma a impressão?”, “Atenção”, JOptionPane.YES_NO_OPTION);
if (confirma == JOptionPane.YES_OPTION);
{
//imprimindo relatório
try {
// usando a classe JasperPrint para preparar a impressao de um relatório
JasperPrint print = JasperFillManager.fillReport(“C:/reports/report4.jasper”, null, conexao);
// a linha abaixo exibe o relatório através da classe JasperViewer
JasperViewer.viewReport(print, false);
} catch (Exception e) {
JOptionPane.showMessageDialog(null, e);
}
}
}

Obrigado a todos desde já!

Você está chamando 14 vezes o jTable1.getValueAt e o jTable1.getSelectedRow()?
Não se faz isso, utilize variáveis locais.

Você tem uma classe Tblgem para representar os objetos lidos da sua tabela do banco de dados?
Se não tem, crie.

Você criou seu próprio TableModel para renderizar um List de objetos do tipo Tblgem?
Se não criou, crie.

Segue exemplo de como fazer os INSERT's:

private void adicionar() {
    try {
        String sql = "insert into tblgem(lista,dat,pep,listec,item,material,txtbre,qtde,um,rncrm,necob,natnf,local,pepaux,projeto) values(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)";
        int adicionado = 0;
        int[] linhasSelecionadas = jTable1.getSelectedRows();
        for (int linhaSelecionada : linhasSelecionadas) {
            Tblgem objeto = listaRenderizadaPelaJTable.get(linhaSelecionada);
            PreparedStatement pst = conexao.prepareStatement(sql);
            pst.setString(1,  objeto.getLista());
            pst.setString(2,  objeto.getDat());
            pst.setString(3,  objeto.getPep());
            pst.setString(4,  objeto.getListec());
            pst.setString(5,  objeto.getItem());
            pst.setString(6,  objeto.getMaterial());
            pst.setString(7,  objeto.getTxtbre());
            pst.setString(8,  objeto.getQtde());
            pst.setString(9,  objeto.getUm());
            pst.setString(10, objeto.getRncrm());
            pst.setString(11, objeto.getNecob());
            pst.setString(12, objeto.getNatnf());
            pst.setString(13, objeto.getLocal());
            pst.setString(14, objeto.getPepaux());
            pst.setString(15, objeto.getProjeto());
            adicionado += pst.executeUpdate();
        }                                  
        if (adicionado > 0 ) {
            JOptionPane.showMessageDialog(null, "Requisições adicionadas com sucesso!");
        }
    } catch (Exception e) {
        JOptionPane.showMessageDialog(null, e);
    }
}

Bom dia amigo, muito obrigado pelo retorno, confesso que já estava perdendo a esperança… Sou iniciante então vou dizer o que entendi disso tudo, e tomará que você possa me ajudar.
Você no caso acha melhor eu ter uma Jtable para impressão e outra pra adicionar informação no banco de dados, seria isso?
Sobre criar uma classe para tblgem, eu conseguiria usar meu modulo de ModuloConexao como exemplo? porque é onde eu faço a conexao do BD com o netbens, caso eu esteja falando bobagem, consegue me dar um exemplo mais prático?
E sua última frase confesso que não entendi direito
" Você criou seu próprio TableModel para renderizar um List de objetos do tipo Tblgem ?
Se não criou, crie."

Obrigado desde já, bom dia.

Só essa linha ta dando erro pra eu conseguir testar seu código:

Não.

Como você está populando sua JTable?
Se não criou um TableModel, então já está fazendo gambiarra.

Por exemplo na imagem acima quando eu abri o tópico, eu consigo popular se é disso que você está falando dando um Ctrl C, Ctrl V do Excel, ai obviamente eu coloquei as colunas que preciso de acordo com a tabela. Por que é assim que precisa ser o projeto, em outra tabela, eu consigo fazer exclusão e alteração de informações e pesquisar por pep, só que não citei ela aqui pois essa parte ta pronta já, do jeito que consegui ficou bom. Será que se eu conseguisse te mandar o projeto ficaria mais fácil pra você dar uma analisada? Por que de fato como eu venho mexendo a pouco meses só pode ser que eu esteja fazendo gambiarra e não sei…

Imagens não ajudam, como está o CÓDIGO da sua JTable?

Como é que você está fazendo para setar os valores copiados do Excel para os seus objetos?

ESSE é o código, fiz uma classe só pra isso.

import java.awt.;
import java.awt.event.
;
import javax.swing.;
import java.awt.datatransfer.
;
import java.util.*;

public class ExcelAdapter implements ActionListener {

private String rowstring, value;
private Clipboard system;
private StringSelection stsel;
private JTable jTable1;


public ExcelAdapter(JTable myJTable) {
    jTable1 = myJTable;
    KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C, ActionEvent.CTRL_MASK, false);
    // Identifying the copy KeyStroke user can modify this
    // to copy on some other Key combination.
    KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V, ActionEvent.CTRL_MASK, false);
    // Identifying the Paste KeyStroke user can modify this
    //to copy on some other Key combination.
    jTable1.registerKeyboardAction(this, "Copy", copy, JComponent.WHEN_FOCUSED);
    jTable1.registerKeyboardAction(this, "Paste", paste, JComponent.WHEN_FOCUSED);
    system = Toolkit.getDefaultToolkit().getSystemClipboard();
}


public JTable getJTable() {
    return jTable1;
}

public void setJTable(JTable jTable1) {
    this.jTable1 = jTable1;
}


public void actionPerformed(ActionEvent e) {
    if (e.getActionCommand().compareTo("Copy") == 0) {
        StringBuffer sbf = new StringBuffer();
        // Check to ensure we have selected only a contiguous block of
        // cells
        int numcols = jTable1.getSelectedColumnCount();
        int numrows = jTable1.getSelectedRowCount();
        int[] rowsselected = jTable1.getSelectedRows();
        int[] colsselected = jTable1.getSelectedColumns();
        if (!((numrows - 1 == rowsselected[rowsselected.length - 1] - rowsselected[0]
                && numrows == rowsselected.length)
                && (numcols - 1 == colsselected[colsselected.length - 1] - colsselected[0]
                && numcols == colsselected.length))) {
            JOptionPane.showMessageDialog(null, "Invalid Copy Selection",
                    "Invalid Copy Selection",
                    JOptionPane.ERROR_MESSAGE);
            return;
        }
        for (int i = 0; i < numrows; i++) {
            for (int j = 0; j < numcols; j++) {
                sbf.append(jTable1.getValueAt(rowsselected[i], colsselected[j]));
                if (j < numcols - 1) {
                    sbf.append("\t");
                }
            }
            sbf.append("\n");
        }
        stsel = new StringSelection(sbf.toString());
        system = Toolkit.getDefaultToolkit().getSystemClipboard();
        system.setContents(stsel, stsel);
    }
    if (e.getActionCommand().compareTo("Paste") == 0) {
        System.out.println("Trying to Paste");
        int startRow = (jTable1.getSelectedRows())[0];
        int startCol = (jTable1.getSelectedColumns())[0];
        try {
            String trstring = (String) (system.getContents(this).getTransferData(DataFlavor.stringFlavor));
            System.out.println("String is:" + trstring);
            StringTokenizer st1 = new StringTokenizer(trstring, "\n");
            for (int i = 0; st1.hasMoreTokens(); i++) {
                rowstring = st1.nextToken();
                StringTokenizer st2 = new StringTokenizer(rowstring, "\t");
                for (int j = 0; st2.hasMoreTokens(); j++) {
                    value = (String) st2.nextToken();
                    if (startRow + i < jTable1.getRowCount()
                            && startCol + j < jTable1.getColumnCount()) {
                        jTable1.setValueAt(value, startRow + i, startCol + j);
                    }
                    System.out.println("Putting " + value + "atrow=" + startRow + i + "column=" + startCol + j);
                }
            }
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}

}

E dentro do código dessa minha Tela_Adicionar_Imprimir eu chamei ele:

public Tela_Adicionar_Imprimir() {
initComponents();
conexao = ModuloConexao.conector();
ExcelAdapter myAd = new ExcelAdapter(jTable1);
}