powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / транспортировка Excel->MySql
12 сообщений из 12, страница 1 из 1
транспортировка Excel->MySql
    #33643761
Elena_Kan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
нужно содержимое ячеек в документе Excel проанализировать на тип хранящегося значения и это значение поместить в соответствующую таблицу в MySql (если документе тип значения в ячеике Integer - то в таблицу Integer(znachenie_id, samo_znachenie), если Double-значение, то в таблицу Double(znachenie_id, samo_znachenie), если Double-значение, то в таблицу Double(znachenie_id, samo_znachenie).

Я применяю на Cell функцию getContents():
т.е. делаю в Sheet s:
Код: plaintext
1.
aValue=s.getCell(nomer_kolonki, nomer_stroki).getContents();

а затем передаю полученную строку в функцию:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
 public  Attribute CreateAttribute (String aValue)  
    { 
       try 
      {
          //eсли содержимое строки "парсуется" к Integer, то тип значения установить = "Integer" 

	 int  x=Integer.parseInt(aValue);
             IntegerAttribute a =   new  IntegerAttribute();
             a.setValue(x);
             a.setType("Integer");  
              return  a; 	
      }    
       catch  (Exception e)
      {
	 try 
        {//eсли содержимое строки парсуется к Double , то тип значения установить = "Double" 
             Double  x= Double .parseDouble(aValue);
             DoubleAttribute a =   new  DoubleAttribute();
             a.setValue(x);
             a.setType("Double");  
              return  a; 	
        }
         catch  (Exception ex)
        {//eсли значение не Integer и не Double, то значит Varchar (t.e. String) 
            String x=aValue;
            VarcharAttribute a =   new  VarcharAttribute();
            a.setValue(x);
            a.setType("Varchar");  
             return  a;
         }
      }
    }

С Integer и String проблем нет. Но функция s.getCell().getContents() каким-то образом неправильно работает с Double-значениями, например, применяя эту функцию на значение 0.003515, она возвращает строку "0,003", хотя должна вернуть строку "0,003515". Естъ какой-то другои способ получения типа и значения в Cell?
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33644056
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А вот так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
 package  test_excel2;

 import  jxl.Workbook;
 import  java.io.File;
 import  jxl.Sheet;
 import  jxl.read.biff.*;
 import  java.io.*;
 import  jxl.Cell;
 import  jxl.CellType;
 import  jxl.NumberCell;

 public   class  test_excel2 {
     public  test_excel2() {
    }

     public   static   void  main(String[] args) {
        Workbook w =  null ;
         try  {
            w = Workbook.getWorkbook( new  File("d:/test.xls"));
        }  catch  (BiffException ex) {
        }  catch  (IOException ex) {
        }
        
        Sheet sheet = w.getSheet( 0 );
        Cell c = sheet.getCell( 0 , 0 );
        System.out.println(c.getType());
        Cell c1 = sheet.getCell( 0 , 1 );
        System.out.println(c1.getType());
        Cell c2 = sheet.getCell( 0 , 2 );
        //в c2 - 0,003515
        System.out.println(c2.getType());
        
         if  (c2.getType() == CellType.NUMBER) {
           System.out.println(((NumberCell)c2).getValue());
        }
    }
}
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33644279
Elena_Kan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Спасибо большое! Ещё вопрос один:

(((NumberCell)c2).getValue()) возвращает Double значение, а как Integer вернуть?
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33644366
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А через формат ячейки можно попробовать:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
 package  test_excel2;

 import  jxl.Workbook;
 import  java.io.File;
 import  jxl.Sheet;
 import  jxl.read.biff.*;
 import  java.io.*;
 import  jxl.Cell;
 import  jxl.CellType;
 import  jxl.NumberCell;

 public   class  test_excel2 {
     public  test_excel2() {
    }

     public   static   void  main(String[] args) {
        Workbook w =  null ;
         try  {
            w = Workbook.getWorkbook( new  File("d:/test.xls"));
        }  catch  (BiffException ex) {
        }  catch  (IOException ex) {
        }

        Sheet sheet = w.getSheet( 0 );
        Cell c = sheet.getCell( 0 , 0 );
        System.out.println(c.getType());
        System.out.println("Формат: " + c.getCellFormat().getFormat().getFormatString());
        Cell c1 = sheet.getCell( 0 , 1 );
        //в c1 - 10
        System.out.println(c1.getType());
        System.out.println("Формат: " + c1.getCellFormat().getFormat().getFormatString());        
        Cell c2 = sheet.getCell( 0 , 2 );
        //в c2 - 0,003515
        System.out.println(c2.getType());
        System.out.println("Формат: " + c2.getCellFormat().getFormat().getFormatString());        

         if  (c2.getType() == CellType.NUMBER 
            && c2.getCellFormat().getFormat().getFormatString() == "0.000000") {
           System.out.println(((NumberCell)c2).getValue());
        }
         else   if  (c1.getType() == CellType.NUMBER 
            && c1.getCellFormat().getFormat().getFormatString() == "0") {
            
             Double  d =  new   Double ((((NumberCell)c1).getValue()));
             int  i = d.intValue();
            
            System.out.println(i);
        }
    }
}
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33645628
Elena_Kan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
у меня функция c2.getCellFormat().getFormat().getFormatString()) возвращает null даже если ячейка не пустая. Т.е. вот этот кусок кода:

Cell c2 = sheet.getCell(0,2);
//в c2 - 0,003515
System.out.println(c2.getType());
System.out.println("Формат: " + c2.getCellFormat().getFormat().getFormatString());

выдаёт мне:
Формат:
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33645887
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Значит, проблемы какие-то с заданием формата ячеек в Excel-файле.

Со сравнением строк я, конечно, сглупила в спешке. :(
Конечно же equals.

if (c2.getType() == CellType.NUMBER
&& c2.getCellFormat().getFormat().getFormatString().equals("0.000000"))
if (c1.getType() == CellType.NUMBER
&& c1.getCellFormat().getFormat().getFormatString().equals("0"))
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33646608
Elena_Kan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А какие могут быть проблемы с форматом ячеек в Excel?

про сравнение строк я поняла, что описка, а вот с форматом прямо горе :(
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33646643
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для своего примера я в Excel-файле явным образом указала формат каждой ячейки, и никаких проблем с выводом формата у меня не возникло.

A1 (Cell c) - Текстовый
A2 (Cell c1) - Числовой (число десятичных знаков: 0)
A3 (Cell c2) - Числовой (число десятичных знаков: 6)
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33646824
Elena_Kan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ааа, у меня нет возможности задать формат каждой ячейки, т.к. есть уже готовые файлы с информацией (разным количеством столбцов, разными форматами), и нужно написать программу, которая по ячейке бы их правильно загоняла в соответствующие таблицы в MySql.

У тебя больше нет подобных хороших идей, не затрагивая формат? ;)
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33646897
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
        Pattern p = Pattern.compile("^\\d+\\.0$");
        //так будет выглядеть Integer после приведения к Double

         if  (c1.getType() == CellType.NUMBER) {

             Double  d =  new   Double ((((NumberCell) c1).getValue()));
            System.out.println(d.toString());

             if  (p.matcher(d.toString()).matches()) {
                System.out.println("Integer");
                 int  i = d.intValue();
            }  else  {
                System.out.println("Double");
            }
        }
        
         if  (c2.getType() == CellType.NUMBER) {

             Double  d =  new   Double ((((NumberCell) c2).getValue()));
            System.out.println(d.toString());

             if  (p.matcher(d.toString()).matches()) {
                System.out.println("Integer");
                 int  i = d.intValue();
            }  else  {
                System.out.println("Double");
            }
        } 
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33651745
Elena_Kan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
я сделала так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
...

 if  (aCell.getType() == CellType.NUMBER)
{//if contents of a Cell is double                      

    Double  aDouble= new   Double (((NumberCell)aCell).getValue());            

   // cast the double to an int:
    int  DoubleToInt = aDouble.intValue();
   Integer CastedInt =  new  Integer (DoubleToInt);

   //get of the CastedInt double value: 
    double  IntToDouble = CastedInt.doubleValue();
 
   //compare "first"double with "new" double value (=intToDouble)
   //if they are equal - the value is Integer, if not - double
    boolean  isInt = aDouble.equals( new   Double (IntToDouble));
           
    if (isInt)
   {
       System.out.println("Integer");
       Integer i = aDouble.intValue();
        return  i;
   } 
    else  
   {
       System.out.println("Double");
        return  aDouble;
   }          
 } 
...     
может кому пригодится, кто с такой же проблемой столкнётся
...
Рейтинг: 0 / 0
транспортировка Excel->MySql
    #33652407
yelena
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все равно, как я понимаю, тип числа в Excel определяется форматом ячейки
А так получается, что вы можете записать в таблицу Integer число с с форматом Double, которое представимо как Integer, т.е. 12345,0

Эксперименты показывают, что формат ячейки не определяется ExcelAPI, когда он "Общий", т.е. в ячейку может быть записано и число, и текст

В ячейку с "Общим" форматом невозможно записать число ни 12345,0 , ни число 12345,00 и т.д., т.к. оно автоматически преобразуется к виду 12345

Поэтому, как мне кажется, формат нужно проверять.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / транспортировка Excel->MySql
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]