SpreadSheetlight Añadir datos a archivo de excel

No logro entender y conseguir añadir datos a un archivo excel ya creado, sin tener que borrarlo y volverlo a crear. Lo que tengo es el código siguiente:

    using System;     using System.Collections.Generic;     using System.Linq;     using System.Text;     using System.Threading.Tasks;     using SpreadsheetLight;      namespace Interop_Excel     {        class Program     {     public void rfexl(string pathfile)     {         SLDocument document = new SLDocument(pathfile);         int row = 2, col = 2;          while (!string.IsNullOrEmpty(document.GetCellValueAsString(row,1)))         {             Console.WriteLine(document.GetCellValueAsString(row,1) + "\t");             Console.WriteLine(document.GetCellValueAsString(row,2) + "\t");             Console.WriteLine(document.GetCellValueAsString(row,3) + "\t");              row++;           }         Console.ReadKey();     }      void writeExcelFile(string pathfile)     {         int fila = 1, col = 1;         SLDocument document = new SLDocument(pathfile);         System.Data.DataTable dataTable = new System.Data.DataTable();         while (string.IsNullOrEmpty(document.GetCellValueAsString(fila, 1)))         {              dataTable.Rows.Add("Salvador", "Salazar", 25, "H");             dataTable.Rows.Add("Josue", "Cruz",19, "H");             dataTable.Rows.Add("Marcelo", "Sánchez",21, "H");              document.ImportDataTable(fila, 1, dataTable, true);             fila++;             if (fila > 10) break;         }         document.Save();     }     static void Main(string[] args)     {         string pathfile = AppDomain.CurrentDomain.BaseDirectory + "captura.xlsx";         SLDocument exl = new SLDocument();         Program program = new Program();          //program.rfexl(pathfile);         program.writeExcelFile(pathfile);         System.Data.DataTable dataTable = new System.Data.DataTable();          //Columnas         dataTable.Columns.Add("Nombre",typeof(string));         dataTable.Columns.Add("Apellido", typeof(string));         dataTable.Columns.Add("Edad", typeof(int));         dataTable.Columns.Add("Sexo", typeof(string));          //Regirstros         dataTable.Rows.Add("Alejandro","Salazar",25,"H");         dataTable.Rows.Add("Alonso", "Cruz",20, "H");         dataTable.Rows.Add("Elena", "Sánchez",19, "M");          exl.ImportDataTable(1,1,dataTable,true);         exl.SaveAs(pathfile);      }     } } 

El método rfexl lee el archivo excel (Read File EXEL) y el WriteExcelFile debería buscar el espacio nulo o vacío y ahi insertar los nuevos datos pero no lo hace. Según entiendo lo primero que debo de hacer es buscar alguna celda vacía para insertar los nuevos registros (o datos) y una vez encontrado los pone pero, ¿me hace falta algo? ¿Qué estoy haciendo mal?

¿Cómo guardar datos en una relación has_many through desde una API?

Estoy haciendo una API en Ruby on Rails, tengo dos modelos plans y categories los cuales hacen una relación muchos a muchos por lo tanto hago uso de una tabla intermedia con el modelo category_plans, la idea es que se cree un plan el cual tiene varias categorias y cada una de ellas tiene dos atributos más (kind, portion) los cuales se guardan en la tabla intermedia (Estoy usando Postgresql).

Category

class Category < ApplicationRecord     has_many :category_plans     has_many :plan, through: :category_plans end 

Plan

class Plan < ApplicationRecord     has_many :category_plans     has_many :category, through: :category_plans end 

CategoryPlan

class CategoryPlan < ApplicationRecord     validates_presence_of :category, :plan      enum kind: {         Colacion: 'Colacion',         Desayuno: 'Desayuno',         Comida: 'Comida',         Cena: 'Cena'     }, _prefix: :kind      belongs_to :category     belongs_to :plan end 

Las migraciones son las siguientes

Plan

class CreatePlans < ActiveRecord::Migration[5.2]     def change         create_table :plans do |t|             t.string :name             t.references :patient, foreign_key: true             t.text :description             t.datetime :deleted_at             t.timestamps         end     end end 

Category

class CreateCategories < ActiveRecord::Migration[5.2]     def change         create_table :categories do |t|             t.string :name             t.timestamps         end     end end 

CategoryPlan

class CreateCategoryPlans < ActiveRecord::Migration[5.2]     def up         execute <<-SQL             CREATE TYPE type_food AS ENUM ('Colacion', 'Desayuno', 'Comida',              'Cena');         SQL          create_table :category_plans do |t|             t.belongs_to :category, :null => false, :index => true             t.belongs_to :plan, :null => false, :index => true             t.column :kind  , :type_food             t.float :portion         end         add_index :category_plans, :kind     end      def down         drop_column :kind, :type_food         execute "DROP kind type_food;"     end end 

Y el controlador

class V1::PlansController < ApplicationController     before_action :set_patient, only: [:show, :update, :destroy]      def create         plan = Plan.new(plan_params)         if plan.save             render json: {status: 'Success', message: 'Saved plan', data:              plan}, status: 201         else             render json: {status: 'Error', message: 'Plan not saved', data:              plan.errors}, status: :unprocessable_entity         end     end      def plan_params         params.require(:plan).permit(:name, :patient_id, :description,          category_plans_attributes: [:id, :kind, :portion,          category_attributes: [:id]])     end  end 

No estoy seguro que el strong params este correcto y tampoco tengo mucha idea de como armar mi JSON, al momento lo tengo así

JSON

{     "plan": {         "name": "Plan 8",            "patient_id": "3",         "description": "Plan nuevo jeje",         "category_plan": {             "kind": "Cena",             "portion": "12.3"         }     }  } 

MVC, problemas al pasar datos de una View a un Controller

Tengo una clase PaneClient, la cual usa CardLayout y “encima” de esta view estan otras 2 views: paneAttributeSet y paneRegisterClient .

El problema esta cuando trato de llamar el metodo getFieldData() desde el controllador PaneRegisterClientController de la view paneRegisterClient haciendo click en el boton Register de dicha view, el metodo debe restituir un objeto de tipo Client inizializado con el input del usuario que seria el ID y nombre del client , pero los valores asignados al objeto Client terminan siendo nullos, es como si el metodo no lograra asignar los valores inseridos en los textfields.

Clase PaneClient:

public class PaneClient{  ..........botones para CRUD.............     private JPanel viewClientPane;      private ClientView clientView = new ClientView();   private AttributesView theAttribView = new AttributesView();      private ClientAttributeSetManagement paneAttributeSet = new ClientAttributeSetManagement();     public PaneRegisterClient paneRegisterClient = new PaneRegisterClient();      public PaneClient() {          setLayout(new CardLayout());         initComponents();      }      protected void initComponents() {      MigLayout layout = new MigLayout("wrap 2", "[grow] [] ", "[] [] []");     viewClientPane = new JPanel(layout);      // put all the panels together     viewClientPane.add(clientView, "flowx,alignx left,growy");     viewClientPane.add(getCrudButtonsPanel(), "cell 0 0");     viewClientPane.add(theAttribView, "cell 0 1");     viewClientPane.add(getNavButtonsPanel(), "south");  // añade las views          add(viewClientPane, "viewClientPane");         add(paneAttributeSet, "pane Aset");         add(paneRegisterClient, "pane Register client");      } public PaneRegisterClient getPaneRegisterClient() {     return paneRegisterClient; } } 

La clase PaneRegisterClient:

private JButton registerButton = new JButton("Register"); private JButton backButton = new JButton("Back"); private JButton finishButton = new JButton("Finish");  public JTextField txtClientID = new JTextField(5); public JTextField txtName = new JTextField(15);  private JPanel registerClientView;  public PaneRegisterClient() {     setLayout(new CardLayout());     initComponents(); }  private void initComponents() {      attributeView = new AttributesView();      MigLayout layout = new MigLayout("wrap 2", "[grow] [] ", "[] [] []");     viewClientPane = new JPanel(layout);      // put all the panels together     viewClientPane.add(getRegisterUserView(), "flowx,alignx left,growy");     viewClientPane.add(attributeView, "flowx,cell 0 1");     viewClientPane.add(registerButton, "cell 0 1");     viewClientPane.add(getNavButtonsPanel(), "south");      add(viewClientPane, "viewUserPane");  }  private JPanel getRegisterUserView() {     registerClientView = getPanel("Client data");     registerClientView.setLayout(new MigLayout("wrap 2", "[] 16 []"));      registerClientView.add(new JLabel("Client ID:"), "right");     registerClientView.add(txtClientID);      registerClientView.add(new JLabel("Name:"), "right");     registerClientView.add(txtName);      return registerClientView; } public boolean isEmptyFieldData() {     return (txtClientID.getText().trim().isEmpty() && txtName.getText().trim().isEmpty()); }  // el metodo llamado que no funziona     public Client getFieldData() {         Client client = new Client();      client.setClientID(txtClientID.getText());     client.setClientName(txtName.getText());      System.out.println("method getfieldata: " + client.getClientID() + client.getClientName());      return client; } public void addNavListener(ActionListener navListener) {     // TODO Auto-generated method stub     backButton.addActionListener(navListener);     finishButton.addActionListener(navListener); }  public void addRegListener(ActionListener regListener) {     registerButton.addActionListener(regListener); } 

Controller PaneRegisterClientController:

public class PaneRegisterClientController { private PaneClient paneClient; private PaneRegisterClient paneRegisterClient;  private ClientBean clientBean = new ClientBean();  public PaneRegisterClientController(PaneClient pClient) {      this.paneClient = pClient;     this.paneRegisterClient = pClient.getPaneRegisterClient();      initComponents();      paneRegisterClient.addNavListener(new NavListener());     paneRegisterClient.addRegListener(new RegListener()); }  private void initComponents() {     // TODO Auto-generated method stub  }  class RegListener implements ActionListener {      Client client = paneRegisterClient.getFieldData();      @Override     public void actionPerformed(ActionEvent e) {          switch (e.getActionCommand()) {          case "Register":              if (paneRegisterClient.isEmptyFieldData()) {                 JOptionPane.showMessageDialog(null, "Some fields are empty");                 return;             }              if (clientBean.create(client) != null) {                  JOptionPane.showMessageDialog(null, "New user registered successfully.");                  client.setClientID("");                 client.setClientName("");                 paneRegisterClient.setFieldData(client);             }             break;          }     } 

Tengo la sospecha que el error esta en la forma en como asigno la view PaneRegisterClient en el costructor del controllador:

private PaneClient paneClient; private PaneRegisterClient paneRegisterClient;  public PaneRegisterClientController(PaneClient pClient) {      this.paneClient = pClient;     this.paneRegisterClient = pClient.getPaneRegisterClient(); .......