2014-11-16 4 views
2

Я пытаюсь использовать apache для ввода введенной пользователем информации в таблицу Excel, поэтому я могу сохранить их учетную информацию. Как получить свои имена пользователей и пароли в этот документ, чтобы у каждого имени пользователя и пароля была своя строка? Вот мой код до сих пор:Получение пользовательского ввода в excel (Apache poi)

Создание листа:

import java.io.FileOutputStream; 

import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 


public class Spreadsheet { 

    public Spreadsheet() { 
     Workbook AccountInfo = new HSSFWorkbook(); 
     Sheet Information = AccountInfo.createSheet(); 

     Row titles = Information.createRow(0); 

     Cell username = titles.createCell(0); 
     username.setCellValue("Username"); 

     Cell password = titles.createCell(1); 
     password.setCellValue("Password"); 

     try { 
      FileOutputStream Accounts = new FileOutputStream("Account Information.xls"); 
      AccountInfo.write(Accounts); 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Получение пользовательского ввода:

import java.awt.Color; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPasswordField; 
import javax.swing.JTextField; 
import javax.swing.border.Border; 

import org.apache.poi.hssf.usermodel.HSSFCell; 
import org.apache.poi.hssf.usermodel.HSSFRow; 
import org.apache.poi.hssf.usermodel.HSSFSheet; 
import org.apache.poi.hssf.usermodel.HSSFWorkbook; 
import org.apache.poi.ss.usermodel.Sheet; 
import org.apache.poi.ss.usermodel.Workbook; 

public class CreateAccount extends JFrame implements ActionListener { 

    Workbook AccountInfo = new HSSFWorkbook(); 
    Sheet Information = AccountInfo.createSheet(); 

    JLabel username = new JLabel("Enter your username"); 
    JTextField enterUsername = new JTextField(null, 15); 
    JLabel password = new JLabel("Enter your password"); 
    JPasswordField enterPassword = new JPasswordField(null, 15); 
    JLabel passwordConfirm = new JLabel("Confirm your password."); 
    JPasswordField enterConfirmPassword = new JPasswordField(null, 15); 
    JButton okButton = new JButton("OK"); 

    String userName; 
    double balance; 
    String passString; 

    public CreateAccount() { 

     add(username); 
     add(enterUsername); 
     add(password); 
     add(enterPassword); 
     add(passwordConfirm); 
     add(enterConfirmPassword); 
     add(okButton); 

     okButton.addActionListener(this); 

     setTitle("New Bank Account Creation"); 
     setVisible(true); 
     setLocationRelativeTo(null); 
     setSize(270, 250); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 
     setLayout(new FlowLayout()); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 

     char[] pass = enterPassword.getPassword(); 
     passString = new String(pass); 

     char[] passConfirm = enterConfirmPassword.getPassword(); 
     String passStringConfirm = new String(passConfirm); 

     userName = enterUsername.getText(); 

     if (e.getSource() == okButton) { 
      if(userName.isEmpty() || passString.isEmpty() || !passString.equals(passStringConfirm)) { 

        enterUsername.setText(""); 
        enterPassword.setText(""); 
        enterConfirmPassword.setText(""); 
        Border redLine = BorderFactory.createLineBorder(Color.red); 
        enterUsername.setBorder(redLine); 
        enterPassword.setBorder(redLine); 
        enterConfirmPassword.setBorder(redLine); 
        } 
      }if(!userName.isEmpty() && !passString.isEmpty() && passString.equals(passStringConfirm)){ 
        addAccount(userName,passString); 

       super.dispose(); 

      int response = 0; 
      String firstDesposit = JOptionPane.showInputDialog("Welcome " + userName + ". Enter your initial deposit.\n" + "If you wouldn't like to make an initial deposit, press CANCEL."); 
      balance = Double.parseDouble(firstDesposit); 
      if (response == JOptionPane.OK_OPTION) { 
       new Menu(); 
       } 
      } 
     } 
    private void addAccount(String username, String password) throws IOException { 

     FileInputStream file = new FileInputStream(new File("Account Information.xls"));   
     HSSFWorkbook workbook = new HSSFWorkbook(file); 
     HSSFSheet sheet = workbook.getSheetAt(0); 

     int newRowIndex = sheet.getPhysicalNumberOfRows(); //index of new row to create 
     HSSFRow newRow = sheet.getRow(newRowIndex); 

     HSSFCell usernameCell = newRow.createCell(0); 
     usernameCell.setCellValue(username); 
     HSSFCell passwordCell = newRow.createCell(1); 
     passwordCell.setCellValue(password); 
    } 
} 

Вот класс, где я пытаюсь реализует метод в confirmUsername().

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Iterator; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JTextField; 

import org.apache.poi.ss.usermodel.Cell; 
import org.apache.poi.ss.usermodel.Row; 


public class ViewAccount extends JFrame implements ActionListener { 

    AccountSpreadsheet spreadsheet = new AccountSpreadsheet(); 
    JLabel userName = new JLabel("Username:"); 
    JTextField enterUserName = new JTextField(null,15); 
    JLabel Password = new JLabel("Password:"); 
    JTextField enterPassword = new JTextField(null,15); 
    JButton log = new JButton("Login"); 
    Account account;  

    public ViewAccount() { 

     add(userName); 
     add(enterUserName); 
     add(Password); 
     add(enterPassword); 
     add(log); 
     log.setPreferredSize(new Dimension(250, 40)); 
     log.addActionListener(this); 

     setTitle("Login"); 
     setVisible(true); 
     setSize(300,150); 
     setLayout(new FlowLayout()); 
     setLocationRelativeTo(null); 
     setDefaultCloseOperation(EXIT_ON_CLOSE); 

    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
     if(e.getSource() == log) { 
      confirmUsername(); 
      } 
     } 
    public void confirmUsername() { 
     AccountSpreadsheet Spreadsheet = new AccountSpreadsheet(); 
     CreateAccount Acct = new CreateAccount(); 
     String passString = Acct.passString; 
     String userName = Acct.userName; 


     for (Iterator<Row> rit = Spreadsheet.sheet.rowIterator(); rit.hasNext();) { 
      Row row = rit.next(); 
      for (Iterator<Cell> cit = row.cellIterator(); cit.hasNext();) { 
       Cell cell = cit.next(); 
       String name = cell.getStringCellValue(); 
       if(userName == name) { 
        cit.next(); 
        if(passString == name){ 
         System.out.println("Log success"); 
        }else{ 
         System.out.println("ERROR"); 
        } 
       }else{ 
        System.out.println("ERROR"); 
       } 

      } 
     } 
    } 
} 

Я знаю, что вызов Createaccount будет просто сделать еще одно окно из конструктора Createaccount всплывал, но я не был уверен, как еще получить имя пользователя и passString в метод.

+0

Итак, проблема в том, что вы не знаете, сколько строк уже заполнено, поэтому вы не знаете, где создать новый? – yts

+0

@yts Я не уверен, как я могу ввести имя пользователя и пароль, которые вводит пользователь, и помещать их в столбцы «Username» и «Password» моей созданной таблицы Excel. Я хотел бы получить имена пользователей и пароли в этой электронной таблице, чтобы впоследствии я смог войти в систему для внесения депозитов и снятия средств. –

+0

Я работаю над ответом, но вы уверены, что хотите это сделать? Для этого гораздо больше подходит база данных. – yts

ответ

1

Код, который у вас есть для таблицы, не должен запускаться более одного раза. Это приведет к удалению любой информации, которую вы сохранили. Вот хороший класс электронных таблиц.

import org.apache.poi.xssf.usermodel.XSSFCell; 
import org.apache.poi.xssf.usermodel.XSSFRow; 
import org.apache.poi.xssf.usermodel.XSSFSheet; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

import java.io.*; 

public class AccountSpreadsheet { 

    private XSSFSheet sheet; 
    private final String filename = "Account Information.xlsx"; 

    public AccountSpreadsheet() { 
     try { 
      FileInputStream file = new FileInputStream(new File(filename)); 
      XSSFWorkbook workbook = new XSSFWorkbook(file); 
      sheet = workbook.getSheetAt(0); 
     } catch (FileNotFoundException e) { 
      createSpreadsheet(); //file didn't exist yet 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

    } 

    private void createSpreadsheet() { 
     XSSFWorkbook workbook = new XSSFWorkbook(); 
     sheet = workbook.createSheet(); 
     XSSFRow row = sheet.createRow(0); 
     XSSFCell username = row.createCell(0); 
     username.setCellValue("Username"); 
     XSSFCell password = row.createCell(1); 
     password.setCellValue("Password"); 
     save(); 
    } 

    public void addAccount(String username, String password) { 
     int newRowIndex = sheet.getPhysicalNumberOfRows(); 
     XSSFRow newRow = sheet.createRow(newRowIndex); 

     XSSFCell usernameCell = newRow.createCell(0); 
     usernameCell.setCellValue(username); 
     XSSFCell passwordCell = newRow.createCell(1); 
     passwordCell.setCellValue(password); 
     save(); 
    } 

    private void save() { 
     try { 
      FileOutputStream outStream = new FileOutputStream(filename); 
      sheet.getWorkbook().write(outStream); 
      outStream.close(); 
      sheet = new XSSFWorkbook(new FileInputStream(new File(filename))).getSheetAt(0); //POI bug requires this 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

// public boolean accountExists(String username){ 
//  //does account exist? 
// } 
// 
// public boolean correctLogin(String username, String password) { 
//  //correct username and password? 
// } 
} 

У экземпляра AccountSpreadsheet в классе Createaccount и вызвать addAccount (имя пользователя, пароль) после проверки их.

+0

. Каким будет метод проверки правильности входа в систему? Я попробовал использовать итератор для просмотра списка, пока он не введет введенное имя пользователя (если оно соответствует одному введенному), а затем вызовите cell.next(), чтобы узнать, был ли пароль тем, который назначен для имени пользователя, но не смог его запустить должным образом. –

+0

Что не работает? Отправьте вопрос с кодом и вопросами, которые у вас есть, и дайте мне ссылку здесь, и я посмотрю. Не могу гарантировать как полный ответ, как я дал здесь, но я постараюсь указать вам в правильном направлении;) – yts

+0

Добавлен класс ViewAccount, метод находится внизу! –

Смежные вопросы