Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / транспортировка Excel->MySql / 12 сообщений из 12, страница 1 из 1
04.04.2006, 15:10
    #33643761
Elena_Kan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транспортировка Excel->MySql
нужно содержимое ячеек в документе 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
04.04.2006, 16:24
    #33644056
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транспортировка Excel->MySql
А вот так:

Код: 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
04.04.2006, 17:31
    #33644279
Elena_Kan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транспортировка Excel->MySql
Спасибо большое! Ещё вопрос один:

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

Код: 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
05.04.2006, 11:36
    #33645628
Elena_Kan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транспортировка Excel->MySql
у меня функция 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
05.04.2006, 12:33
    #33645887
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транспортировка Excel->MySql
Значит, проблемы какие-то с заданием формата ячеек в 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
05.04.2006, 15:25
    #33646608
Elena_Kan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транспортировка Excel->MySql
А какие могут быть проблемы с форматом ячеек в Excel?

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

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

У тебя больше нет подобных хороших идей, не затрагивая формат? ;)
...
Рейтинг: 0 / 0
05.04.2006, 16:19
    #33646897
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транспортировка Excel->MySql
Код: 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
07.04.2006, 12:38
    #33651745
Elena_Kan
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транспортировка Excel->MySql
я сделала так:

Код: 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
07.04.2006, 15:08
    #33652407
yelena
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
транспортировка Excel->MySql
Все равно, как я понимаю, тип числа в Excel определяется форматом ячейки
А так получается, что вы можете записать в таблицу Integer число с с форматом Double, которое представимо как Integer, т.е. 12345,0

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

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

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


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