代码之家  ›  专栏  ›  技术社区  ›  user3310115

用多张表格阅读excel的最佳设计模式是什么

  •  0
  • user3310115  · 技术社区  · 6 年前

    我有一个标准格式的excel工作表,它有多个工作表我需要用java阅读这些工作表,并将它们转换为对象并存储在数据库中。我现在使用的是简单的工厂模式。我正在读取工作表名称并基于工作表名称调用相应的转换器对象。这是实现这一目标的唯一途径还是有更好的途径。下面是示例代码。

    FileInputStream fis = new FileInputStream(new File("test.xls"));
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fis);
            int numberOfSheets = hssfWorkbook.getNumberOfSheets();
            for (int i=0; i<numberOfSheets; i++) {
               HSSFSheet sh =  hssfWorkbook.getSheetAt(i);
               String sname = sh.getSheetName();
               switch (sname) {
                   case "Test" : //go to test convertor;
                   case "Test1": //go to test1 convertor
               }
            }
    
    2 回复  |  直到 6 年前
        1
  •  1
  •   Shanu Gupta    6 年前

    我会和 strategy design pattern .

    你可以有一个 ISheetConverter 以及定义自己转换逻辑的多个实现。 看起来像是:

    @FunctionalInterface
    inferface ISheetConverter {
        POJOForSheet convert(SheetStream sheetFromIO);
    }
    

    同样,您现有的工厂类可以返回适当的 ISHEETConverter公司 基于 sh.getSheetName() (稍后将进行转换)。

        2
  •  0
  •   Ajeet Kumar    6 年前

    当然了 策略 图案是这里最合适的。

    下面是完整的代码(虽然是C#),但是它应该解释实现风格

    class Program
    {
        private static void Main(string[] args)
        {
            IStrategyManager manager = new StrategyManager(); // this code is added 
    
            FileInputStream fis = new FileInputStream(new File("test.xls"));
            HSSFWorkbook hssfWorkbook = new HSSFWorkbook(fis);
            int numberOfSheets = hssfWorkbook.getNumberOfSheets();
            for (int i = 0; i < numberOfSheets; i++)
            {
                HSSFSheet sh = hssfWorkbook.getSheetAt(i);
                String sname = sh.getSheetName();
                manager.Manage(sname); // this code is added 
            }          
        }
    }
    

    战略经理存储所有转换器

    interface IStrategyManager
    {
        void Manage(string sheetName);
    }
    
    class StrategyManager : IStrategyManager
    {
        private Dictionary<string, IConverter> dictionary = new Dictionary<string, IConverter>();
    
        public StrategyManager()
        {
         // store converter name & its implementation class name which are one and same
            dictionary.Add("Test", new Test());
            dictionary.Add("Test2", new Test2());
        }
    
        public void Manage(string sheetName)
        {
            dictionary[sheetName].Convert(sheetName); // magic happens here
        }
    }
    

    下面是各种类型的转换器实现

    interface IConverter
    {
        void Convert(string sheetName);
    }
    
    class Test : IConverter
    {
        public void Convert(string sheetName)
        {
            /*   conversion logic for test converter  goes here*/
        }
    }
    
    class Test2 : IConverter
    {
        public void Convert(string sheetName)
        {
            /*   conversion logic for test2 converter  goes here*/
        }
    }
    

    @用户3310115,希望有帮助,如果需要澄清,请联系我。谢谢